2012-08-13 14 views
6

हम एमवीसी 4 डेटा एनोटेशन के साथ कुछ कस्टम सत्यापन बनाने की कोशिश कर रहे हैं, हम जिस सत्यापन को बना रहे हैं वह एक प्रकार का संदेश प्रतिबंधित सत्यापन से अधिक संकेत देता है। सबसे पहले हमने प्रमाणीकरण एट्रिब्यूट कक्षा से विरासत में कुछ कस्टम सत्यापन कक्षाएं बनाई हैं और डेटा का परीक्षण करने के लिए IsValid() विधि को ओवरराइड कर रहा है और वैध नहीं होने पर सत्यापन प्रमाणीकरण वापस कर दिया है। का मानना ​​है कि इस डेटा को प्रदर्शित करता है आंशिक विचारों कि EditorTemplates का उपयोग उस्तरा प्रदर्शित करने के लिए उत्पन्न डेटा हमारे कस्टम डेटा एनोटेशन और का उपयोग कर है अधिक सत्यापन में बनाया गया है, यह सब बताने के लिए की तरह इसएमवीसी 4 कस्टम डेटा एनोटेशन मैनुअल jquery सत्यापन कॉल

@using (Html.BeginForm(new { ReturnUrl = ViewBag.ReturnUrl })) 

हमारी आवश्यकताओं को एक रूप में लपेटा जाता है कर रहे हैं उपयोगकर्ता पोस्ट वापस डेटा और आंशिक रूप से रूपों को बचाने, लेकिन किसी भी अमान्य फ़ील्ड तो फार्म पर CSS वर्ग का उपयोग कर रहे पर उन्हें संकेत तो

<input type="submit" value="Save" class="cancel"/> 

तरह पोस्टबैक अनुमति देने के लिए प्रस्तुत सभी इस ठीक काम कर रहा है, लेकिन हम अब पृष्ठ पर सभी त्रुटि संदेशों को प्रदर्शित करने के लिए आवश्यकताओं लोड जो मैं जब तक मैं इसे करने की कोशिश में एक समस्या नहीं देखा ...

मैं कुछ उदाहरण है कि $ (document) .ready घटना है कि के रूप में यहाँ देखा

Manual form validation in MVC 3 and JQuery प्रपत्र वैध तरीकों कहा जाता है में jQuery का इस्तेमाल किया पाया

लेकिन यह हमारे लिए $ ('फॉर्म') काम नहीं कर रहा था। मान्य() ऐसा लगता है कि फॉर्म सत्यापन को आग लगने वाला एकमात्र कॉल ऐसा नहीं है $ ('form') मान्य है।() लेकिन यह केवल [आवश्यक] विशेषताओं जैसे अंतर्निहित सत्यापन को दिखाने के लिए प्रतीत होता है और कस्टम सत्यापन संदेश दिखाने का एकमात्र तरीका है पोस्ट सबमिट करने के लिए सबमिट बटन का उपयोग करना फार्म।

पृष्ठ पर पहली बार सही पोस्ट किए बिना संदेशों को प्रदर्शित करने के लिए मेरे कस्टम डेटा एनोटेशन प्राप्त करने का एक तरीका होना चाहिए? किसी भी मदद की सराहना की जाएगी।

उत्तर

6

ठीक है तो मुझे परिणाम प्राप्त करने का एक तरीका मिला है, हालांकि मैं चाहता था कि यह थोड़ा और काम था/कल्पना की गई थी। मैं जो सामान लापता था, वह था कि मैंने अपनी कस्टम सत्यापन कक्षा में आईसीलिएंट वैलिटेबल को इम्प्लांट नहीं किया था और मुझे jQuery सत्यापनकर्ता एडेम विधि में अपना कस्टम सत्यापन जोड़ना पड़ा था, जिसे मैंने कोशिश की थी, लेकिन कस्टम सत्यापन वर्ग में आईसीलिएंट वैलिटेबल के साथ नहीं, मैं जल्दी से दौड़ूंगा कैसे यह सोचते हैं आप सभी jQuery सामान की स्थापना की है यह काम कर रहे im प्राप्त करने के लिए के माध्यम से/शामिल

पहले साधारण मॉडल एक कस्टम सत्यापन का उपयोग करता है बनाने का श्रेय

public class Person 
{ 
    [Required] 
    [Display(Name="Name")] 
    public string Name { get; set; } 
    public int Age { get; set; } 

    //Uses a custom data annotation that requires that at lease it self or the property name passed in the constructor are not empty 
    [OneOfTwoRequired("Mobile")] 
    public string Phone { get; set; } 
    [OneOfTwoRequired("Phone")] 
    public string Mobile { get; set; } 
} 

प्रतिबिंब का उपयोग करता है संपत्ति प्राप्त करने के लिए कस्टम मान्यता वर्ग

के साथ परीक्षण करने के लिए पारित स्ट्रिंग नाम का

नोट 15/08/2012 के रूप में: यदि आप MVC 4 का उपयोग कर रहे आप संदर्भित करने के लिए System.web.mvc 3.0 IClientValidatable के उपयोग के लिए ModelClientValidationRule कोई MVC 4 में

public class OneOfTwoRequired : ValidationAttribute, IClientValidatable 
    { 
     private const string defaultErrorMessage = "{0} or {1} is required."; 

     private string otherProperty; 

     public OneOfTwoRequired(string otherProperty) 
      : base(defaultErrorMessage) 
     { 
      if (string.IsNullOrEmpty(otherProperty)) 
      { 
       throw new ArgumentNullException("otherProperty"); 
      } 

      this.otherProperty = otherProperty; 
     } 

     public override string FormatErrorMessage(string name) 
     { 
      return string.Format(ErrorMessageString, name, otherProperty); 
     } 

     protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
     { 
      PropertyInfo otherPropertyInfo = validationContext.ObjectInstance.GetType().GetProperty(otherProperty); 

      if (otherPropertyInfo == null) 
      { 
       return new ValidationResult(string.Format("Property '{0}' is undefined.", otherProperty)); 
      } 

      var otherPropertyValue = otherPropertyInfo.GetValue(validationContext.ObjectInstance, null); 

      if (otherPropertyValue == null && value == null) 
      { 
       return new ValidationResult(this.FormatErrorMessage(validationContext.DisplayName)); 
      } 

      return ValidationResult.Success; 
     } 
     public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
     { 
      yield return new ModelClientValidationRule 
      { 
       ErrorMessage = FormatErrorMessage(metadata.DisplayName), 
       //This is the name of the method aaded to the jQuery validator method (must be lower case) 
       ValidationType = "oneoftworequired" 
      }; 

     } 
    } 
मौजूद लगते करता है के रूप में की आवश्यकता होगी

इसे व्यू या आंशिक रूप से जोड़ें, आपको यह सुनिश्चित करना होगा कि यह $ (दस्तावेज़) में नहीं है।तैयार विधि

jQuery.validator.addMethod("oneoftworequired", function (value, element, param) { 
     if ($('#Phone).val() == '' && $('#Mobile).val() == '') 
      return false; 
     else 
      return true; 
    }); 

    jQuery.validator.unobtrusive.adapters.addBool("oneoftworequired"); 

jQuery सत्यापनकर्ता सामान केवल यदि आप वापस पोस्ट किए बिना या पर प्रारंभिक पृष्ठ लोड प्रपत्र मान्य करने के लिए और है कि आप सिर्फ $ फोन (क्या करना चाहते हैं की जरूरत किया जा रहा है 'फॉर्म')। मान्य()

आशा इस नू में अपनी उपलब्ध मदद करता है किसी को :)

0

क्यों अपनी सी # कोड सामान्य, किसी भी दो क्षेत्रों के लिए लागू है, जबकि स्क्रिप्ट कोड आईडी "#phone" और "#mobile" के साथ क्षेत्रों के लिए विशेष रूप से जुड़ा हुआ है है? क्या स्क्रिप्ट को सामान्यीकृत करने का कोई तरीका नहीं है?

+0

गलती हाँ आप अधिक सामान्य स्क्रिप्ट का उपयोग कर सकते हैं, लेकिन यह एक ऐसा मामला था जहां मेरे पास प्रति पृष्ठ केवल 1 फोन 1 मोबाइल तत्व होगा, इसलिए यह सामान्य है लेकिन आप केवल कक्षा के लिए आईडी बदल सकते हैं ($ ('। विकल्प 1 ')। वैल() ==' 'और $ (' विकल्प 2 ')। वैल() ==' ') और यह अधिक सामान्य होगा तो फोन प्रकार। – Troublesum

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