2011-06-27 5 views
14

मैंने कुछ पोस्ट पर पढ़ा है, लेकिन अब यह नहीं मिला कि एमवीसी 3 में इसे एक वैलिडेटर बनाने के लिए वास्तव में आवश्यक नहीं था, केवल विशेषता। क्या ये सच है? मैं कहता हूं कि मुझे यह भ्रमित लगता है कि विशेषता में आईसीलिएंट वैलिटेबल है। तो डेटा एन्नोटेशन मॉडेल वैलिडेटेटर क्लास क्या करता है यदि एनोटेशन में क्लाइंट साइड स्क्रिप्ट नाम (IClientValidatable) है, और सत्यापन करने की क्षमता (सत्यापन प्रमाणीकरण IsValid) है?एमवीसी 2 बनाम एमवीसी 3 कस्टम प्रमाणीकरण विशेषताएँ डेटा एन्नोटेशन मॉडेल वैलिडेटरप्रोवाइडर। रजिस्ट्रार एडाप्टर

यदि मुझे वैश्विक में सत्यापनकर्ता के साथ विशेषता पंजीकृत नहीं करना है तो यह वास्तव में अच्छा होगा। क्या यह किया जा सकता है? क्या मैंने कुछ बुरी सलाह पढ़ी?

संपादित करें: दिलचस्प है कि मैंने वैधता को छोड़कर बस इसका परीक्षण किया है, सभी तर्क IsValid में डालें और यह बहुत अच्छा काम करता है। मुझे लगता है कि एकमात्र चीज जो गायब हो सकती है नियंत्रक संदर्भ होगी, लेकिन मुझे यकीन नहीं है कि सत्यापन में उपयोगी है। IsValid में ValidationContext है जिसमें सेवा की आवश्यकता है यदि मुझे सेवा की आवश्यकता है। कोई वास्तविक नुकसान मैं यहां नहीं उठा रहा हूं?

संपादित करें 2: मैं इस उदाहरण से एक सत्यापनकर्ता के साथ शुरू होगा: http://blogs.msdn.com/b/simonince/archive/2010/06/04/conditional-validation-in-mvc.aspx

विशेषता:

public class RequiredIfAttribute : ValidationAttribute, IClientValidatable 
{ 
    private RequiredAttribute innerAttribute = new RequiredAttribute(); 
    public string DependentProperty { get; set; } 
    public object TargetValue { get; set; } 

    public RequiredIfAttribute(string dependentProperty, object targetValue) 
    { 
     this.DependentProperty = dependentProperty; 
     this.TargetValue = targetValue; 
    } 

    public override bool IsValid(object value) 
    { 
     return innerAttribute.IsValid(value); 
    } 

    public System.Collections.Generic.IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     ModelClientValidationRule modelClientValidationRule = new ModelClientValidationRule() 
     { 
      ErrorMessage = FormatErrorMessage(metadata.DisplayName), 
      ValidationType = "requiredifattribute" 
     }; 
     modelClientValidationRule.ValidationParameters.Add("requiredifattribute", DependentProperty); 
     yield return modelClientValidationRule; 
    } 
} 

सत्यापनकर्ता:

public class RequiredIfValidator : DataAnnotationsModelValidator<RequiredIfAttribute> 
{ 
    public RequiredIfValidator(ModelMetadata metadata, ControllerContext context, RequiredIfAttribute attribute) 
     : base(metadata, context, attribute) 
    { 
    } 

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() 
    { 
     return base.GetClientValidationRules(); 
    } 

    public override IEnumerable<ModelValidationResult> Validate(object container) 
    { 
     var field = Metadata.ContainerType.GetProperty(Attribute.DependentProperty); 
     if (field != null) 
     { 
      var value = field.GetValue(container, null); 
      if ((value == null && Attribute.TargetValue == null) || 
       (value.Equals(Attribute.TargetValue))) 
      { 
       if (!Attribute.IsValid(Metadata.Model)) 
        yield return new ModelValidationResult { Message = ErrorMessage }; 
      } 
     } 
    } 
} 
ऊपर वर्तमान कोड के साथ

, मैं Global.asax.cs फ़ाइल में पंजीकरण करने की आवश्यकता है:

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredIfAttribute), typeof(RequiredIfValidator)); 

लेकिन अगर मैं सिर्फ विशेषता में सब कुछ ले जाते हैं, मेरे पास है न यह रजिस्टर करने के लिए:

public class RequiredIfAttribute : ValidationAttribute, IClientValidatable 
{ 
    private RequiredAttribute innerAttribute = new RequiredAttribute(); 
    public string DependentProperty { get; set; } 
    public object TargetValue { get; set; } 

    public RequiredIfAttribute(string dependentProperty, object targetValue) 
    { 
     this.DependentProperty = dependentProperty; 
     this.TargetValue = targetValue; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     var field = validationContext.ObjectInstance.GetType().GetProperty(DependentProperty); 
     if (field != null) 
     { 
      var dependentValue = field.GetValue(validationContext.ObjectInstance, null); 
      if ((dependentValue == null && TargetValue == null) || 
       (dependentValue.Equals(TargetValue))) 
      { 
       if (!innerAttribute.IsValid(value)) 
        return new ValidationResult(ErrorMessage); 
      } 
     } 
     return ValidationResult.Success; 
    } 

    public System.Collections.Generic.IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context) 
    { 
     ModelClientValidationRule modelClientValidationRule = new ModelClientValidationRule() 
     { 
      ErrorMessage = FormatErrorMessage(metadata.DisplayName), 
      ValidationType = "requiredifattribute" 
     }; 
     modelClientValidationRule.ValidationParameters.Add("requiredifattribute", DependentProperty); 
     yield return modelClientValidationRule; 
    } 
} 

वहाँ अन्य कोड के सभी जगह कोड के अंतिम बिट के साथ एक समस्या है? मैं वैधकर्ता वर्ग क्यों रखूंगा?

+0

आप कहाँ इस सलाह को पढ़ने गए थे? –

+0

मेरी इच्छा है कि मैं इसे पा सकूं, लेकिन मैं नहीं कर सकता। यह किसी के पद पर एक टिप्पणी थी। आपने इस बारे में क्या सोचा? इस समय – CrazyDart

+0

मुझे कुछ भी नहीं लगता क्योंकि मैं अभी भी यह समझने की कोशिश कर रहा हूं कि समस्या/प्रश्न क्या है।मैं बस कुछ और संदर्भ, विशेष कोड उदाहरण इत्यादि देखने की उम्मीद कर रहा था ... इसलिए, मैंने स्रोत के लिए अधिक संदर्भ देखने की कोशिश करने के लिए कहा क्योंकि आपने अपने प्रश्न में पर्याप्त प्रदान नहीं किया है। उम्मीद है कि आप कुछ विशिष्ट कोड उदाहरण प्रदान करेंगे जो आपको सामना कर रहे समस्या का वर्णन करते हैं। –

उत्तर

10

CrazyDart,

IClientValidatable इंटरफ़ेस MVC3 में जोड़ा गया है।

आपका दूसरा उदाहरण इस नए इंटरफ़ेस का वैध उपयोग दिखाता है। आप सही हैं कि इसे पंजीकृत नहीं होना है, और यह सत्यापन के लिए आवश्यक क्लाइंट साइड नियम प्रदान करेगा, साथ ही साथ आवश्यक सर्वर साइड सत्यापन भी करेगा।

आगे बढ़ें, इसका आनंद लें।

counsellorben

+1

वैसे यह पता चला है कि आप सही हैं। मैं IClientValidatable का उपयोग करूंगा, और इसे करने के दौरान मैं अच्छा लगेगा। ;-) – CrazyDart

+1

मुझे लगता है कि ICLientValidatable के लिए अभी भी एक को jquery सत्यापन एडाप्टर और सत्यापन विधियों के लिए क्लाइंट साइड स्क्रिप्ट जोड़ने की आवश्यकता है IlientValidatable की मेरी समझ के अनुसार। – afr0

0

जब मैं CrazyDart से अंतिम विकल्प सर्वर साइड हिस्सा MVC4 में अच्छा काम करता है का उपयोग करें।

सिवाय इसके कि मैं काम करने के लिए क्लाइंट-साइड सत्यापन नहीं प्राप्त कर सकता हूं। यह ग्राहक पक्ष पर एक आवश्यक फ़ील्ड की जांच नहीं करता है (हालांकि कुछ टैग जोड़े गए हैं)।

मैं भी 2 ब्लॉग पोस्ट देख लिया है इस बारे में साइमन इन्स की (1 पोस्टर की प्रेरणा है): http://blogs.msdn.com/b/simonince/archive/2011/02/04/conditional-validation-in-asp-net-mvc-3.aspx

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