क्या डेटा एनोटेशन को सशर्त बनाने का कोई तरीका है? मेरे पास एक टेबल 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')
तो उपनाम आवश्यक है, अन्यथा उपनाम खाली हो सकता है।
संपादित करें
अगर मुझे इस सत्यापन को नियंत्रक में ले जाना है, तो मैं इसे वहां कैसे करूं? मैं वहां से वही त्रुटि संदेश कैसे ट्रिगर कर सकता हूं?
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>
मुझे पता है कि इस विषय में कुछ समय है, लेकिन यदि आप इसके लिए केवल घोषणात्मक सत्यापन का उपयोग करना चाहते हैं, तो आप बस इस तरह के एक सरल निर्माण का उपयोग कर सकते हैं (देखें यह संदर्भ आगे की संभावनाओं के लिए):
[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; }
नियंत्रक में आप इस तरह जांच सकते हैं: इससे पहले कि (ModelState.IsValid)
if (model.party_type == 'p')
{
this.ModelState.Remove("surname");
}
संबंधित सवाल
नए सवाल
asp.net-mvc
ASP.NET MVC फ्रेमवर्क एक ओपन सोर्स वेब एप्लीकेशन फ्रेमवर्क है और टूलींग है जो वेब एप्लिकेशन के अनुरूप तैयार किए गए मॉडल-व्यू-कंट्रोलर (MVC) पैटर्न के एक संस्करण को लागू करता है और एक ASP.NET टेक्नोलॉजी फाउंडेशन पर बनाया गया है।