2012-02-12 18 views
13

मैं अपने ऐप पर एक कस्टम अविभाज्य सत्यापन जोड़ने की कोशिश कर रहा हूं। यह सत्यापन चलाने के लिए प्रतीत नहीं होता है।एएसपी .NET एमवीसी 3: कस्टम अविभाज्य सत्यापन

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
    ModelMetadata metadata, ControllerContext context) 
{ 
    yield return new ModelClientValidationRule 
    { 
     ErrorMessage = ErrorMessage, 
     ValidationType = "custrequired" 
    }; 
} 

और मेरे जावास्क्रिप्ट:

यहाँ मेरी विशेषता वर्ग है

$.validator.addMethod('custrequired', function(value, element, param) { 
    return value && value !== '99:99' && value !== '9:99'; 
}); 

$.validator.unobtrusive.adapters.add('custrequired', null, function(options) { 
    return options.messages['custrequired'] = options.message; 
}); 

उत्तर

31

चीजें हैं जो गलत यहां जा सकते हैं बहुत सारे हैं, कोड द्वारा पोस्ट की गई शामिल कोई भी:

  • कैसे <input> देखने के लिए अपनी सृजित HTML? क्या इसमें data-val-custrequired विशेषता शामिल है?

  • यदि नहीं, तो क्या आपको कक्षा घोषणा में इंटरफ़ेस जोड़ने की याद आती है - IClientValidatable?

  • आप नहीं एक DOM ready हैंडलर के अंदर अपने कस्टम सत्यापनकर्ता जोड़ने के लिए याद किया? (यानी $(document).ready() या $(function() { ... }) का उपयोग न करें) - दस्तावेज़ तैयार होने से पहले सत्यापन स्थापित किया जाना चाहिए।

ईटीए: पिछले एक के लिए कारण jquery.validate.unobtrusive करता है जो:

$(function() { 
    $jQval.unobtrusive.parse(document); 
}); 

अर्थात, और यह दस्तावेज़ पार्स सत्यापन जिम्मेदार बताते हैं, नियमों आदि दस्तावेज तैयार पर के लिए। चूंकि उस स्क्रिप्ट को आपके एडेप्टर पंजीकृत करने के लिए लोड किया जाना है, इसलिए आपकी पंजीकरण स्क्रिप्ट को आमतौर पर jquery.validate.unobtrusive.js के बाद आना होगा। लेकिन यह हैंडलर को भी पंजीकृत करता है जिसे के बाद "अविभाज्य" एक के बाद कहा जाता है - जिस बिंदु से यह बहुत देर हो चुकी है। मुझे लगता है कि आप अपनी पंजीकरण स्क्रिप्ट पहले रख सकते हैं और फिर .ready का उपयोग कर सकते हैं। कभी कोशिश नहीं की, और मैंने इसे कभी नहीं देखा है।

इसके अलावा, इस मामले में, इस एडाप्टर रजिस्टर करने के लिए पर्याप्त होना चाहिए:

$.validator.addMethod('custrequired', function(value, element, param) { 
    return value && value !== '99:99' && value !== '9:99'; 
}); 

jQuery.validator.unobtrusive.adapters.addBool('custrequired'); 

यह अभी भी आप हो सकता है किसी भी कस्टम त्रुटि संदेश जोड़ना होगा, लेकिन जब से अपने सत्यापनकर्ता अतिरिक्त पैरामीटर का उपयोग नहीं किया जाता है (जैसे उदाहरण के लिए StringLengthMaximumLength आदि पास करता है), कस्टम एडाप्टर की कोई आवश्यकता नहीं है।

+0

मैं '$ (फ़ंक्शन() {...}) में वैधता जोड़ रहा था ... क्या मैं कारण जान सकता हूं कि यह क्यों काम नहीं करता है? – Moon

+0

@Moon - एक स्पष्टीकरण के प्रयास के साथ संपादित किया गया। – JimmiTh

+2

मेरे मामले में यह काम नहीं कर रहा था क्योंकि मेरे पास '$ (document.ready() 'के अंदर कोड था। बहुत बढ़िया जवाब! बहुत मदद मिली ... –

3

$.validator.unobtrusive.adapters.add कॉल के साथ कुछ समस्याएं हैं: उन दो बदलावों के बाद

$.validator.unobtrusive.adapters.add('custrequired', function (options) { 
// -------------------------------------------------^ <-- removed "null" param 
    options.messages['custrequired'] = options.message; 
    // Register the rule properly 
    options.rules['custrequired'] = options.params; 
    // Don't return anything 
}); 

(और यह सुनिश्चित करना कि क्लाइंट प्रमाणीकरण और Unobtrusive जावास्क्रिप्ट web.config में सक्षम थे), बात ठीक काम किया है।

+0

प्रतिक्रिया के लिए बहुत बहुत धन्यवाद। लेकिन अभी भी इसे काम नहीं मिल सकता है। – Moon

+0

@Moon क्या आपको पृष्ठ पर कोई त्रुटि है? –

0

आपको सर्वर की तरफ बदलना होगा।

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
    ModelMetadata metadata, ControllerContext context) 
    { 
     //I changed ErrorMessage for ErrorMessageString 
     yield return new ModelClientValidationRule 
     { 
     ErrorMessage = ErrorMessageString, 
     ValidationType = "custrequired" 
     }; 
    } 

और यह भी रूप में आंद्रे व्हिटेकर ने कहा कि आप clien ओर करने के लिए अपने मान्यता जोड़ने के लिए इस पर रखना होगा।

//i changed param for params 
    $.validator.addMethod('custrequired', function(value, element, params) { 
     return value && value !== '99:99' && value !== '9:99'; 
    }); 

    //i specified that there isn't paramaters using an empty array. 
    $.validator.unobtrusive.adapters.add('custrequired', [] , function (options) { 
     options.messages['custrequired'] = options.message; 
     options.rules['custrequired'] = options.params; 
    }); 

इनपुट के HTML की जांच करने के लिए याद रखें, यह चाहिए कि आपके त्रुटि संदेश टेक्स्ट

मुझे आशा है कि यह आप के लिए काम करता है के साथ "डेटा-" विशेषता।

संबंधित मुद्दे