2011-03-21 11 views
5

पर कोई मूल्य है, तो मैं प्रॉपर्टी में केवल एक मान्य प्रमाणीकरण का उपयोग कैसे कर सकता हूं Prop2 केवल प्रो 1 सत्य है?किसी अन्य संपत्ति के पास एमवीसी 3/jQuery वैलिडेटर

Ex: 
public bool Prop1 { get; set; } 

[Required] // I need this validation only if the Prop1 is true. 
public string Prop2 { get; set; } 

कोई विचार? मुझे क्लाइंट और सर्वर की तरफ चाहिए। धन्यवाद

उत्तर

0

आप इस नौकरी के लिए एक कस्टम सत्यापनकर्ता लिख ​​सकते हैं।

मुझे बताएं कि आपको इसे करने में मदद की ज़रूरत है या नहीं।

+0

कस्टम वैलिडेटर वेबफॉर्म के लिए है। वह एमवीसी में डेटा एन्नोटेशन के बारे में पूछ रहा है। –

+1

क्या ?! आप नहीं जानते कि आप अपना कस्टम सत्यापनकर्ता लिख ​​सकते हैं और इसे एमवीसी में उपयोग कर सकते हैं ?! इस ब्रैडविल्सन प्रस्तुति को देखें और जानें! http://bradwilson.typepad.com/blog/2011/02/advanced-aspnet-mvc-3-presentation.html – Zote

+2

मैं एक 'कस्टम वैलिडेटर' कह रहा हूं http://msdn.microsoft.com/en-us/ लाइब्रेरी/system.web.ui.webcontrols.customvalidator.aspx आपके द्वारा jQuery सत्यापन प्लगइन में जोड़े गए नियमों से भिन्न है। एक सत्यापन प्रदाता जोड़कर, जैसा कि मेरे उत्तर में है, आप जोड़े गए नियमों को निर्दिष्ट कर रहे हैं। इन्हें डीओएम तैयार पर jQuery द्वारा पार्स किया गया है। एक सत्यापन प्रमाणीकरण स्क्रिप्ट जोड़ना आपके लिए इन नियमों को उत्पन्न करने के लिए DataAnnotations ढांचे को अनुमति देने के रूप में लचीला या पुन: प्रयोज्य नहीं है। –

4

इसमें दो भाग हैं। सबसे पहले, आपको एक आवश्यक विशेषता लिखनी होगी जो केवल तभी जरूरी है जब अन्य संपत्ति आपके मानदंडों को पूरा करे। आप सत्यापनकर्ता रजिस्टर करने के लिए है, जो तुम सिर्फ RequiredAttribute के सत्यापनकर्ता का पुन: उपयोग कर सकते हैं होगा Global.asax में Application_Start में

public class RequiredComparerAttribute : RequiredAttribute 
{ 
    public OtherProperty { get; set; } 
    public override bool IsValid(object value) 
    { 
     // TODO: use reflection to validate other property as PropertyInfo 
     // or validate it's value after it is decided to be valid 

     foreach (ValidationAttribute va in property 
      .GetCustomAttributes(typeof(ValidationAttribute), true) 
      .OfType<ValidationAttribute>()) 
     { 
      if (!va.IsValid(value)) 
      { 
       return false; // not required 
      } 
     } 
     return true; // required 
    } 
} 

फिर,:

आप की तरह कुछ करने के लिए होगा

 DataAnnotationsModelValidatorProvider 
      .RegisterAdapter(typeof(RequiredComparerAttribute), 
       typeof(RequiredAttributeAdapter)); 

यदि आप अपना खुद का सत्यापनकर्ता जोड़ना चाहते हैं, तो आपको एक कस्टम सत्यापनकर्ता लिखना होगा। फिल Haack ने अपने ब्लॉग पर एक उदाहरण है: http://haacked.com/archive/2009/11/19/aspnetmvc2-custom-validation.aspx

संपादित करें: कैसे OtherProperty का मूल्य प्राप्त करने की भावना के लिए नेट परावर्तक में CompareAttribute पर एक नजर डालें। तुलना करें एट्रिब्यूट क्लाइंट पक्ष पर आवश्यक सत्यापन नियम प्रदान करने के लिए IClientValidatable लागू करता है।

I नहीं लगता है तुलनात्मकता आपके लिए काम करेगी क्योंकि आपको यह सत्यापित करना होगा कि किसी अन्य संपत्ति की सामग्री के आधार पर एक मूल्य आवश्यक है, दो गुणों की समानता की तुलना नहीं।

संपादित 2: प्रमाणीकरण प्रदाता क्या करता है?

यह फॉर्म में नियम जोड़ता है और उन नियमों के लिए संदेश प्रदान करता है। आप देख सकते हैं कि RequiredAttributeAdapter एमवीसी 3 स्रोत डाउनलोड करके यह कैसे करता है। क्या यह ग्राहक के पक्ष है, तो आप खोल सकते हैं गूगल क्रोम में MVC 3 पेज को समझने के लिए, CTRL + SHIFT + जम्मू मारा एक डेवलपर टूल विंडो को लाने और प्रवेश करने के लिए:

$('form:first').data().unobtrusiveValidation.options 

नियमों वस्तु के अंदर विकल्प निर्दिष्ट करता है प्रत्येक आइटम को सत्यापित करने के लिए और संदेश ऑब्जेक्ट त्रुटि संदेश निर्दिष्ट करता है जो प्रत्येक सत्यापन त्रुटि के लिए प्रदर्शित किया जाएगा।

Edit3: पूर्ण उदाहरण

इस सवाल का जवाब देने के बाद से, मैं ग्राहक (विनीत सत्यापन) और सर्वर पर एक कस्टम विशेषता बनाने की एक पूरी उदाहरण के साथ एक ब्लॉग पोस्ट में लिखा है। ब्लॉग पोस्ट here है। यह उदाहरण एक 'शामिल' विशेषता के लिए है, लेकिन यह एक आवश्यक तुलना बनने के लिए संशोधित करना बहुत आसान होना चाहिए।

+0

धन्यवाद, लेकिन मुझे लगता है कि एक कस्टम सत्यापनकर्ता सबसे अच्छा तरीका है। :) – Cesar

+0

@ सीज़र: कस्टम वैलिडेशन एट्रिब्यूट से विरासत संभवतः जाने का तरीका है, इसलिए आपको प्रतिबिंब टुकड़ा करने की ज़रूरत नहीं है, लेकिन यह पोस्ट आपको बताता है कि सर्वर-साइड और क्लाइंट-साइड "कस्टम सत्यापनकर्ता" को कैसे कार्यान्वित किया जाए। यदि आपका मतलब ग्राहक पक्ष पर सत्यापन नियम है, तो यहां उन लोगों का एक अच्छा स्पष्टीकरण है: http://bradwilson.typepad.com/blog/2010/10/mvc3-unobtrusive-validation.html –

+0

मैंने ब्लॉग पोस्ट कैसे लिखा है क्लाइंट और सर्वर दोनों पर सत्यापन के लिए एक कस्टम DataAnnotations विशेषता बनाने के लिए। [इसे यहां पढ़ें] (http://www.ipreferjim.com/2011/08/dataannotations-mvc3-unobtrusive- validations/) और [स्रोत कोड यहां] (https://github.com/jimschubert/ContainsAttributeExample) –

7

आप इस्तेमाल कर सकते हैं MVC FoolProof मान्यता ढांचे

यह है

[RequiredIf] 
[RequiredIfNot] 
[RequiredIfTrue] 
[RequiredIfFalse] 
[RequiredIfEmpty] 
[RequiredIfNotEmpty] 
[RequiredIfRegExMatch] 
[RequiredIfNotRegExMatch] 

[Is] 
[EqualTo] 
[NotEqualTo] 
[GreaterThan] 
[LessThan] 
[GreaterThanOrEqualTo] 
[LessThanOrEqualTo] 

आशा यह आप में मदद मिलेगी की तरह उपयोगी सुविधा!

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