2010-11-30 9 views
15

मैं Validator.TryValidateValue() का उपयोग करना चाहता हूं लेकिन मैकेनिक्स को समझ नहीं पा रहा हूं। कहो, मैं निम्नलिखित है:डेटा एनाटोटेशन में सत्यापन प्रमाणीकरण को समझना

public class User { 
    [Required(AllowEmptyStrings = false)] 
    [StringLength(6)] 
    public string Name { get; set; } 
} 

और विधि:

public void CreateUser(string name) {...} 

मेरे सत्यापन कोड है:

ValidationAttribute[] attrs = bit of reflection here to populate from User class 
var ctx = new ValidationContext(name, null, null); 
var errors = new List<ValidationResult>(); 
bool valid = Validator.TryValidateValue(name, ctx, errors, attrs); 

यह ठीक काम करता है जब तक name का मूल्य null है। ValidationContext को तुरंत चालू करते समय मुझे ArgumentNullException मिल रहा है और समझ में नहीं आता है। TryValidateValue() गैर-शून्य संदर्भ की भी मांग करता है। मेरे पास एक मूल्य और गुणों की एक सूची है जो सत्यापित करने के लिए है। ValidationContext के लिए क्या है?

+0

इससे पहले कि यह मुझे लगता है कि आपको ऑब्जेक्ट प्रकार को प्रमाणीकरण कॉन्टेक्स्ट में पास नहीं किया जाना चाहिए, संपत्ति नहीं ... इसलिए उपयोगकर्ता के उदाहरण में गुजरना जो शून्य नहीं है। –

+0

यदि आप DataAnnotation की विशेषता को कस्टमाइज़ करना चाहते हैं, तो आप [मेरी पोस्ट] पर जा सकते हैं (http://weblogs.asp.net/thangchung/archive/2010/06/25/extending-resource-provider-for-soring- संसाधन-इन-द-डेटाबेस.aspx) इसके अलावा, आप सत्यापनकर्ता को भी कस्टमाइज़ करते हैं। – thangchung

उत्तर

18

आपके कोड के बारे में गलत बात यह है कि आपके सत्यापन संदर्भ के लिए उदाहरण वस्तु है। उदाहरण को मान्य होने की आवश्यकता नहीं है। Validator.ValidateProperty के लिए, हाँ, यह उस वस्तु का होना आवश्यक है जो संपत्ति का मालिक है, लेकिन Validator.ValidateValue के लिए, "यह" पर्याप्त है।

मैं सेटअप करने के लिए एक मान्यता सहायक वर्ग लिखा है, यह मुझे कहीं से मनमाना मूल्यों में गुजरने देता है।

public class ValidationHelper 
{ 
    private List<ValidationResult> m_validationResults = new List<ValidationResult>(); 
    private List<ValidationAttribute> m_validationAttributes = new List<ValidationAttribute>(); 

    public Tuple<bool, List<string>> ValidateDOB(DateTime? dob) 
    { 
     m_validationAttributes.Add(new CustomValidationAttribute(typeof(DateOfBirthValidator), "ValidateDateOfBirth")); 
     bool result = Validator.TryValidateValue(dob, 
          new ValidationContext(this, null, null), 
          m_validationResults, 
          m_validationAttributes); 
     if (result) 
     { 
      return Tuple.Create(true, new List<string>()); 
     } 
     List<string> errors = m_validationResults.Select(vr => vr.ErrorMessage).ToList(); 
     return Tuple.Create(false, errors); 
    } 
} 

गुण भी है मान्यता संपत्ति पर जिम्मेदार बताते मान्य रहे हैं, तो यह एक बहुत आसान है:

internal void Validate(T value) 
{ 
    if (!m_Initializing && TrackChanges && !Entity.IsImmutable) 
    { 
     Validator.ValidateProperty(value, new ValidationContext(Entity, null, null) { MemberName = PropertyName ?? ModelName }); 
    } 
} 

"एंटिटी" वर्तमान वर्ग के एक संपत्ति उद्देश्य यह है कि मैं चाहता हूँ संदर्भ है सत्यापित करना। यह मुझे अन्य वस्तुओं पर गुणों को मान्य करने देता है। यदि आप पहले से ही objct के अंदर हैं, "यह" फिर से पर्याप्त होगा।

+1

धन्यवाद, मेरे सहयोगी ने मुझे वैलिडेशन कॉन्टेक्स्ट को गैर-शून्य से कुछ भी पास करने का सुझाव दिया और यह काम किया। लेकिन मुझे अभी भी समझ में नहीं आता क्यों TryValidateValue() ValidationContext की मांग करता है। खराब डिजाइन? केवल निर्माता ही जानते हैं, लेकिन मुझे आपके उत्तर को यहां देखने के लिए उम्मीद नहीं थी ताकि आप +50 हो सकें। – UserControl

+3

धन्यवाद! ऑब्जेक्ट इंस्टेंस ऑब्जेक्ट्स और गुणों को मान्य करने के लिए समझ में आता है, लेकिन मानों को मान्य करने के लिए बहुत कम है, और यह सभी मामलों में वही मान्यकरण कॉन्टेक्स्ट क्लास है। आपको विजुअल स्टूडियो डीबगर में स्रोत कोड के माध्यम से कदम उठाने के द्वारा डिजाइनर इरादे में कुछ अंतर्दृष्टि मिल सकती है। स्रोत डाउनलोड करने और .NET फ्रेमवर्क कक्षाओं में डीबग करने के लिए विजुअल स्टूडियो को स्थापित करने के निर्देशों के लिए http://referencesource.microsoft.com/ देखें। –

+3

@UserControl यहाँ एक ब्लॉग पोस्ट रचनाकारों में से एक ने ValidationContext समझा है: http://jeffhandley.com/archive/2010/10/25/RiaServicesValidationContext.aspx – Michael

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