मेरे दृश्य मॉडल में कुछ गुण हैं जो सहेजते समय वैकल्पिक होते हैं, लेकिन सबमिट करते समय आवश्यक होते हैं। एक शब्द में, हम आंशिक बचत की अनुमति देते हैं, लेकिन पूरा फॉर्म सबमिट किया जाता है, हम यह सुनिश्चित करना चाहते हैं कि सभी आवश्यक फ़ील्ड में मूल्य हों।कुछ डेटा एनोटेशन विशेषता को चुनिंदा रूप से कैसे सत्यापित करें?
केवल दृष्टिकोण इस पल में मैं के बारे में सोच सकते हैं:
ModelState त्रुटियों संग्रह में हेरफेर।
दृश्य मॉडल में सभी [Required]
विशेषताएँ हैं। अगर अनुरोध आंशिक रूप से सहेजता है, तो नियंत्रक कार्रवाई में प्रवेश करते समय ModelState.IsValid
false
बन जाता है। फिर मैं सभी ModelState
(जो ICollection<KeyValuePair<string, ModelState>>
है) त्रुटियों के माध्यम से चलाता है और [Required]
गुणों द्वारा उठाई गई सभी त्रुटियों को हटा देता है।
लेकिन अगर अनुरोध पूरा फॉर्म जमा करना है, तो मैं ModelState
में हस्तक्षेप नहीं करूंगा और [Required]
गुण प्रभावी होंगे। बचाने के लिए और प्रस्तुत
यह एक और भी अधिक बदसूरत है आंशिक के लिए
उपयोग अलग दृष्टिकोण मॉडल। एक दृश्य मॉडल में सभी [Required]
विशेषताएँ शामिल होंगी, जो सबमिट करने के लिए एक क्रिया विधि द्वारा उपयोग की जाती हैं। लेकिन आंशिक रूप से सहेजने के लिए, मैं फॉर्म डेटा को एक अलग क्रिया में पोस्ट करता हूं जो सभी [Required]
विशेषताओं के बिना एक समान दृश्य मॉडल का उपयोग करता है।
जाहिर है, मैं बहुत सारे डुप्लिकेट कोड/दृश्य मॉडल के साथ समाप्त होगा।
आदर्श समाधान
मैं सोच कर दिया गया है, तो मैं उन आवश्यक गुण के लिए एक कस्टम डेटा एनोटेशन विशेषता [SubmitRequired]
बना सकते हैं। और किसी भी तरह से आधिकारिक बचत करते समय सत्यापन को अनदेखा कर दिया जाता है लेकिन जमा करते समय नहीं।
अभी भी एक स्पष्ट सुराग नहीं हो सका। कोई भी मदद कर सकता है? धन्यवाद।
आप एक [मूर्खतापूर्ण] (http://foolproof.codeplex.com/) '[RequiredIfTrue]' या इसी तरह की विशेषता का उपयोग कर सकते हैं (आपके दृश्य मॉडल में अतिरिक्त 'बूल सबमिट की गई' संपत्ति के आधार पर। 'false' है तो' [RequiredIfTrue "SubmitRequired"] 'से सजाए गए गुणों पर कोई सत्यापन नहीं किया जाएगा, अन्यथा गुण मान्य किए जाएंगे। –
धन्यवाद, स्टीफन। यह पैकेज 2012 में अंतिम अपडेट के साथ बीटा है। लेकिन यह 'आवश्यक' ने सही दिशा को इंगित किया। वास्तव में सराहना करें। – Blaise
मुझे उस कोड से लिंक संलग्न करने दें जो मैं उपयोग करूंगा: http://foolproof.codeplex.com/SourceControl/latest#Foolproof/RequiredIf.cs – Blaise