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

public class Party
{
    [Required(ErrorMessage = "{0} is missing")]
    [DisplayName("Your surname")]
    public object surname { get; set; }

    [DisplayName("Type")]
    public object party_type { get; set; }
    ...
}  

मुझे उपनाम के आवश्यक डेटा एनोटेशन के लिए एक शर्त चाहिए, कुछ इस तरह:
if (party_type=='P') तो उपनाम आवश्यक है, अन्यथा उपनाम खाली हो सकता है।

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

21
Niklas 23 जून 2011, 15:53

3 जवाब

सबसे बढ़िया उत्तर

आप अपने मॉडल को IValidatableObject से इनहेरिट कर सकते हैं और फिर अपना कस्टम तर्क मान्य विधि में डालें। आपको संपत्ति से RequredAttribute को भी हटाना होगा। क्लाइंट पर इस नियम को मान्य करने के लिए आपको कुछ कस्टम जावास्क्रिप्ट लिखना होगा क्योंकि मान्य विधि अविभाज्य सत्यापन ढांचे में अनुवाद नहीं करती है। नोट कास्टिंग से बचने के लिए मैंने आपके गुणों को स्ट्रिंग में बदल दिया है।

साथ ही, यदि आपके पास विशेषताओं से अन्य सत्यापन त्रुटियां हैं, तो वे पहले आग लग जाएंगी और मान्य विधि को चलने से रोकेंगी ताकि आप केवल इन त्रुटियों का पता लगा सकें यदि विशेषता-आधारित सत्यापन ठीक है।

public class Party : IValidatableObject
{
    [DisplayName("Your surname")]
    public string surname { get; set; }

    [DisplayName("Type")]
    public string party_type { get; set; }
    ...

    public IEnumerable<ValidationResult> Validate( ValidationContext context )
    {
         if (party_type == "P" && string.IsNullOrWhitespace(surname))
         {
              yield return new ValidationResult("Surname is required unless the party is for an organization" );
         }
    }
}

क्लाइंट पर आप कुछ ऐसा कर सकते हैं:

 <script type="text/javascript">
 $(function() {
      var validator = $('form').validate();
      validator.rules('add', {
          'surname': {
              required: {
                 depends: function(element) {
                      return $('[name=party_type]').val() == 'P';
                 }
              },
              messages: {
                  required: 'Surname is required unless the party is for an organization.'
              }
           }
      });
 });
 </script>
31
tvanfosson 23 जून 2011, 16:26
मेरी पार्टी कक्षा डीबीएमएल से उत्पन्न होती है इसलिए मैं अपने कोड के उस हिस्से में बदलाव नहीं करना चाहता हूं। अगर मैं आंशिक कक्षा बनाऊं तो क्या मैं अभी भी ऐसा कर सकता हूं?
 – 
Niklas
23 जून 2011, 16:12
- हां। बस आंशिक है जिसे आप IValidatableObject से प्राप्त करते हैं और मान्य विधि को लागू करते हैं। यदि आप ऑब्जेक्ट के साथ प्रकार के रूप में फंस गए हैं (अजीब लगता है, कॉलम एक वर्ण प्रकार नहीं है?), आपको मान्य विधि में कास्टिंग का उपयोग करना होगा। IValidatableObject मॉडल बाध्यकारी सत्यापन तर्क में बंधे हैं ताकि आप नियंत्रक में एक वैध मॉडल की जांच कर सकें। ध्यान दें कि यदि आपके पास विशेषताओं से अन्य सत्यापन त्रुटियां हैं, तो वे पहले सक्रिय होंगी और मान्य विधि को चलने से रोकेंगी ताकि आप केवल इन त्रुटियों का पता लगा सकें यदि विशेषता-आधारित सत्यापन ठीक है।
 – 
tvanfosson
23 जून 2011, 16:18
हाँ, यह मेरी जेनरेट की गई कक्षा में एक स्ट्रिंग है। मैंने अपनी पार्टी_मेटाडेटा कक्षा से कॉपी किया है जहां मैं अपनी टिप्पणियां रखता हूं। मुझे लगता है कि अगर मैं डीबी में टाइप बदलता हूं तो उसे वहां ऑब्जेक्ट होना चाहिए? (सिर्फ अनुमान)। धन्यवाद, मैं यह कोशिश करूँगा।
 – 
Niklas
23 जून 2011, 16:23
ठीक है, आखिरी वाला। यदि आप डेटा एनोटेशन का उपयोग करते हैं तो आपको न केवल एक सारांश संदेश मिलता है बल्कि उपनाम का इनपुट फ़ील्ड भी लाल हो जाता है। क्या मैं किसी तरह उपनाम के इनपुट क्षेत्र को लक्षित कर सकता हूँ?
 – 
Niklas
23 जून 2011, 17:14
1
- यदि आप उस कंस्ट्रक्टर का उपयोग करते हैं जो ValidationResult पर संपत्ति के नामों की सूची लेता है, तो आप निर्दिष्ट कर सकते हैं कि कौन से मॉडल गुण संदेश से जुड़े हैं। मुझे लगता है कि यह उसी तरह काम करेगा और उन गुणों के साथ-साथ सारांश में सत्यापन त्रुटियों को भी जोड़ देगा। उस दृश्य में उस संपत्ति के सत्यापन तर्क को ट्रिगर करना चाहिए।
 – 
tvanfosson
23 जून 2011, 17:59

मुझे पता है कि इस विषय में कुछ समय है, लेकिन यदि आप इसके लिए केवल घोषणात्मक सत्यापन का उपयोग करना चाहते हैं, तो आप बस इस तरह के एक सरल निर्माण का उपयोग कर सकते हैं (देखें यह संदर्भ आगे की संभावनाओं के लिए):

[RequiredIf(DependentProperty = "party_type", TargetValue = "P")]
public string surname { get; set; }

public string party_type { get; set; }

अपडेट करें:

ExpressiveAnnotations 2.0 के बाद से, एक महत्वपूर्ण बदलाव आया है। अब वही काम सरल तरीके से किया जा सकता है:

[RequiredIf("party_type == 'P'")]
public string surname { get; set; }
3
jwaliszko 9 पद 2015, 18:17
1
मैं इसे लागू नहीं कर सकता क्योंकि मुझे इस परियोजना पर काम करते हुए कुछ समय हो गया है, लेकिन अगर यह काम करता है तो यह बहुत आसान लगता है।
 – 
Niklas
10 पद 2013, 16:22

नियंत्रक में आप इस तरह जांच सकते हैं: इससे पहले कि (ModelState.IsValid)

if (model.party_type == 'p')
{
   this.ModelState.Remove("surname");
}
0
Nalan Madheswaran 26 अक्टूबर 2013, 23:42
मेरी राय है कि यह बहुत बुरा अभ्यास होगा, नियंत्रकों को कभी भी किसी भी मॉडल को मैन्युअल रूप से मान्य नहीं करना चाहिए।
 – 
Jason Loki Smith
15 जिंदा 2015, 15:28