2010-01-11 11 views
12

मैंने एएसपी.नेट एमवीसी 2 में कस्टम क्लाइंट-साइड सत्यापन पर Phil Haack's post पढ़ा है। मैं वही काम करना चाहता हूं लेकिन jQuery एडाप्टर के साथ और एएसपी.नेट एमवीसी 2 आरसी का उपयोग करना (जैसा कि एमवीसी 2 बीटा के विपरीत है का उपयोग करता है)। क्या कोई यह समझने में सक्षम है कि यह कैसे करें?एएसपी.नेट एमवीसी 2 आरसी में कस्टम क्लाइंट-साइड jQuery सत्यापन कैसे लिखें?

मैं विशेष रूप से पासवर्ड मिलान सत्यापन को कार्यान्वित करना चाहता हूं (यानी पासवर्ड & पासवर्ड की पुष्टि करनी चाहिए)। एएसपी.नेट एमवीसी 2 आरसी वीएस.NET प्रोजेक्ट टेम्पलेट दिखाता है कि सर्वर-साइड पर इसे कैसे कार्यान्वित किया जाए (PropertiesMustMatchAttribute का उपयोग करके) लेकिन क्लाइंट-साइड पर नहीं।

+0

दो सवाल यहाँ की तरह होते हैं: 1) कैसे आप क्लाइंट की तरफ मॉडल स्तरीय सत्यापन करते हैं? 2) आप jQuery का उपयोग करके उस सत्यापन को कैसे निष्पादित करते हैं? वे दोनों दिलचस्प प्रश्न हैं। आप इसे शामिल करने के लिए प्रश्न शीर्षक को अपडेट करना चाह सकते हैं। (मुझे # 1 के जवाब में दिलचस्पी है लेकिन गलती से इस प्रश्न पर हुआ।) –

उत्तर

15

मुझे लगता है कि आप पहले से ही यहाँ http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx) कस्टम एमएस AJAX ग्राहक सत्यापन के साथ काम करने का सत्यापन प्राप्त करने पर पीछा किया फिल Haack के निर्देशों। यह jQuery के साथ काम करने के लिए, आप MicrosoftMvcJQueryValidation.js फ़ाइल को संशोधित करने की आवश्यकता होगी:

  • __MVC_CreateRulesForField (validationField) समारोह में, आप एक मामले बयान जोड़ने की आवश्यकता होगी। ([ "मिनट"] rulesObj, thisRule.ValidationParameters)

    __MVC_ApplyValidator_Price;: फिल के उदाहरण को जारी, आप जोड़ने की आवश्यकता होगी:

    मामले "मूल्य"

    ब्रेक;

  • फिर आप __MVC_ApplyValidator_Price समारोह बनाने की आवश्यकता होगी:

समारोह __MVC_ApplyValidator_Price (वस्तु, मूल्य) {

// min is what jQuery Validate uses to validate for minimum values 
object["min"] = value; 

}

फिल के लाने के लिए पर्याप्त होना चाहिए कि उदाहरण काम कर रहा है।

अब, आपके गुणों के बारे में MustMatchAttribute सत्यापन के संबंध में, ऐसा लगता है कि एमवीसी कक्षाओं को सजाने वाले विशेषताओं के लिए क्लाइंट-साइड जेसन सत्यापन परिभाषा उत्पन्न करता है। चूंकि PropertiesMustMatchAttribute मॉडल (और संपत्ति नहीं) पर उपयोग किया जाना चाहिए, इसलिए मैं यह नहीं समझ सकता कि इसे क्लाइंट-साइड सत्यापन को कैसे ट्रिगर करना है। इसके बजाय, मैंने एक अलग दृष्टिकोण लिया। मैंने एक डमी सत्यापन विशेषता बनाई है जो IsValid() अधिभार हमेशा सत्य देता है, और एक संपत्ति पर इस विशेषता का उपयोग किया। यह सिर्फ एक डमी विशेषता है जो सत्यापन सत्यापन को jQuery सत्यापनकर्ता के बराबर फ़ंक्शन पर प्रतिनिधि करेगा।

public class PropertiesMustMatchClientTriggerAttribute : ValidationAttribute 
{ 
    public string MatchProperty { get; set; } 

    public PropertiesMustMatchClientTriggerAttribute(string matchProperty) 
    { 
     MatchProperty = matchProperty; 
     ErrorMessage = "{0} doesn't match {1}."; 
    } 
    public override bool IsValid(object value) 
    { 
     return true; 
    } 

    public override string FormatErrorMessage(string name) 
    { 
     return String.Format(CultureInfo.CurrentCulture, ErrorMessageString, name, MatchProperty); 
    } 
} 

यहां कस्टम सत्यापनकर्ता है::

DataAnnotationsModelValidatorProvider.RegisterAdapter (typeof:

public class PropertiesMustMatchClientTriggerValidator : DataAnnotationsModelValidator<PropertiesMustMatchClientTriggerAttribute> 
{ 
    private string _message; 
    private string _matchProperty; 

    public PropertiesMustMatchClientTriggerValidator(ModelMetadata metaData, ControllerContext context, PropertiesMustMatchClientTriggerAttribute attribute) 
     : base(metaData, context, attribute) 
    { 
     _message = attribute.FormatErrorMessage(metaData.DisplayName); 
     _matchProperty = attribute.MatchProperty; 
    } 

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() 
    { 
     var rule = new ModelClientValidationRule 
     { 
      ErrorMessage = _message, 
      ValidationType = "equalTo" 
     }; 
     rule.ValidationParameters.Add("matchField", _matchProperty); 

     return new[] { rule }; 
    } 
} 

ऊपर कस्टम सत्यापनकर्ता फिल के ब्लॉग प्रति Application_Start() में पंजीकृत होना आवश्यक है यहाँ डमी विशेषता है (PropertiesMustMatchClientTriggerAttribute), टाइपऑफ (PropertiesMustMatchClientTriggerValidator));

अंत में, आपको MicrosoftMvcJQueryValidation को संशोधित करने की आवश्यकता है।js फ़ाइल:

  • __MVC_CreateRulesForField के लिए निम्न मामले बयान जोड़ें:

मामले "equalTo":

__MVC_ApplyValidator_EqualTo (rulesObj, thisRule.ValidationParameters [ "matchField"]);

ब्रेक;

समारोह __MVC_ApplyValidator_EqualTo (वस्तु, elemId) {

object["equalTo"] = document.getElementById(elemId); 

}

अब आप एक संपत्ति के लिए डमी सत्यापन विशेषता साथ जोड़ने की आवश्यकता:

  • इस समारोह जोड़ने

    [PropertiesMustMatchClientTrigger("Password")] 
        public string ConfirmPassword { get; set; } 
    

    ऐसा करना चाहिए।

    इस डमी विशेषता को बनाना थोड़ा बदसूरत है, इसलिए मुझे उम्मीद है कि कोई और अधिक सुरुचिपूर्ण समाधान के साथ आ सकता है।

+0

विस्तृत उत्तर के लिए धन्यवाद। मैं कोशिश करूँगा और बाद में परिणाम अपडेट करूँगा। –

+0

इस पर बस एक त्वरित अनुवर्ती। सी 4 एमवीसी (http://www.viddler.com/explore/c4mvc/videos/24/) पर ब्रैड विल्सन की बात के आधार पर, एमवीसी टीम एमवीसी 3 में मॉडल-स्तरीय एनोटेशन के लिए क्लाइंट-साइड सत्यापन लागू करने पर विचार कर रही है। यदि वे करते हैं कि, इस तरह की समस्या हल करने के लिए बहुत आसान हो जाएगा। –

+0

अंततः मैंने आपके समाधान की कोशिश की और यह आकर्षण की तरह काम करता है। बहुत धन्यवाद! –

1

यहाँ एक कस्टम jQuery मान्यता कैसे जोड़ा जाता है:

$.validator.addMethod("noSpaces", function(value, element) { 
    if ($(element).val().indexOf(" ") >= 0) { 
     return false; 
    } else { 
     return true; 
    } 
}, "Value must not contain spaces"); 
+0

आप उस कस्टम विधि को एएसपी.नेट एमवीसी 2 के सत्यापन इंजन में कैसे एकीकृत कर सकते हैं? –

+0

फिल की पोस्ट के आधार पर, अकेले नाम को यह करना चाहिए। लेकिन मैंने अभी तक कोशिश नहीं की है। –

0

मुझे पता है कि यह एक पुरानी पोस्ट है, और आप एमवीसी 2 का उपयोग कर रहे थे, लेकिन एमवीसी 3 अब तुलनाएट्रिब्यूट के साथ आता है, जिसका उपयोग पासवर्ड पुष्टिकरण मिलान के आपके उपयोग के मामले में किया जा सकता है।

स्रोत: http://www.nickriggs.com/posts/asp-net-mvc-3-data-annotations-provide-property-level-contingent-validation/

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