MVC3 मॉडलस्ट्रेट त्रुटियों को हटा दें


83

मुझे एक ऐसी स्थिति मिली है जहां मैं एक छवि अपलोड कर रहा हूं जिसे उपयोगकर्ता ने अपने स्थानीय फ़ाइल सिस्टम से चुना है। मेरे विचार में मेरा फॉर्म, मूल रूप से दो सबमिट बटन हैं। फॉर्म को सामान्य रूप से सबमिट करने के लिए उपयोग किया जाता है, और सभी सत्यापन निष्पादित होते हैं। दूसरा केवल छवि अपलोड करने के लिए है, जिस स्थिति में मैं अभी तक सत्यापन नहीं करना चाहता।

मैंने अपनी 'अपलोड इमेज' सबमिट बटन को "स्टाइल-नेम कैंसल" का एक वर्ग मान देकर क्लाइंट साइड सत्यापन को बंद करने में कामयाब रहा, इसलिए

<input type="submit" name="UploadImageButton" value="Upload Image" class="style-name cancel" /> 

अब, जब मैं वापस पोस्ट करता हूं, तो मेरे मॉडल में एक संपत्ति UploadImageButton है, जब यह बटन क्लिक किया जाता है, तो यह इस संपत्ति (इनपुट का नाम संपत्ति से मेल खाता है) को पॉप्युलेट करता है। इस तरह, मुझे पता है कि क्या फॉर्म मेरे सच्चे सबमिट बटन द्वारा या UploadImageButton द्वारा प्रस्तुत किया गया था।

मेरा सवाल यह है ... मैं सर्वरसाइड सत्यापन को कैसे बंद कर सकता हूं? जब उपयोगकर्ता इस बटन पर क्लिक करता है तो मुझे सत्यापन सारांश जानकारी नहीं दिखती है। मुझे पता है कि आप इसका उपयोग करके कस्टम मॉडल त्रुटियों को जोड़ सकते हैं

ModelState.AddModelError("{key}", "{error msg}");

मैं मॉडल त्रुटियों को दूर करने के साधन की तलाश में हूं। क्या यह संभव है?

संपादित करें:

यहां वह है जो मैंने जुटाया:

foreach (var key in ModelState.Keys.ToList().Where(key => ModelState.ContainsKey(key))) {
     //ModelState.Remove(key); //This was my solution before
     ModelState[key].Errors.Clear(); //This is my new solution. Thanks bbak
}

यदि आप एक क्यों कर रहे हैं Where(key => ModelState.Keys.Contains(key))? ऐसा लगता है कि जहां खंड निरर्थक है, क्योंकि ModelState.Keys में प्रत्येक कुंजी का अपना ModelState.Keys.Contains (कुंजी) सही होगा।
मैक्सिम ज़स्लेवस्की

1
मैंने सवाल और पाठ को अपडेट किया है, ModelState.CtaintainsKey पर छोटी विधि का उपयोग करने के लिए, हालांकि आपकी धारणा में गलत है। ये वही काम कर रहे हैं।
जेफ रेड्डी

क्षमा करें, हो सकता है कि मैंने खराब तरीके से समझाया हो या आपके उत्तर को गलत समझा हो। रहे हों तो सही है कि आप ModelState.ContainsKey(key)और ModelState.Contains(key)एक ही बात करते हैं, लेकिन मेरी बात है कि में सभी मान है ModelState.Keys.ToList()स्वभाव से वसीयत में शामिल किया जाना ModelStateहै, तो पूरे Whereखंड अनावश्यक है और नीचे प्रदर्शन धीमी हो जाएगी। मामूली बात, यद्यपि।
मैक्सिम ज़स्लावस्की

यही कारण है कि ReSharper एक साथ फेंक रहा था। यह बात बताने के लिए धन्यवाद।
जेफ रेड्डी

1
बस आपको यह पता लगाने का तरीका है कि कौन सा बटन सबमिट का स्रोत था। ViewModel में आपके पास यह गुण नहीं है। बस कंट्रोलर में एक फॉर्मकोलेक्शन पैरामीटर जोड़ें: Public ActionResult Index (YourViewModelClass मॉडल, FormCollection formCollection)। और जाँचें कि क्या बटन का नाम इसमें है: यदि (फॉर्म-कलेक्शन ["UploadImageButton"]! = !Ull)। मुझे लगता है कि आपके पास अधिक सबमिट बटन होने पर यह बेहतर है।
jannagy02

जवाबों:


145

आप कुछ ऐसा करके मॉडल की त्रुटियों को दूर कर सकते हैं:

if (ModelState.ContainsKey("{key}"))
    ModelState["{key}"].Errors.Clear();

1
यही वह है जिसकी तलाश में मैं हूं। मैंने अपना चयनित उत्तर (क्षमा करें एडम तुलिपर) बदल दिया है।
जेफ रेड्डी

धन्यवाद, कि बस मेरे कुछ घंटों को बचाया!
एजेंट 007

1
बस अगर कोई सोच रहा था, तो यह भी प्रभावित करता हैModelState.IsValid
Red Taz

2
अजीब बात है, मेरे मामले में यह पर्याप्त नहीं था। मुझे ModelState ["{key}"] जोड़ना था। ValidationState = ModelValidationState.Valid;
AGuyCalledGerald

67

यह पिछले उत्तरों को बनाता है, लेकिन इसे थोड़ा और सरल करता है:

foreach (var modelValue in ModelState.Values)
{
    modelValue.Errors.Clear();
}

7

सामान्य तौर पर, आप सर्वर-साइड सत्यापन को बंद नहीं करना चाहते हैं या मॉडलस्टैट त्रुटियों को मैन्युअल रूप से हटा सकते हैं। यह उल्लेखनीय है, लेकिन त्रुटि-प्रवण है क्योंकि इसे चाबी के रूप में तारों पर भरोसा करना चाहिए। मैंने कुंजी को कैसे हटाएं, इस पर उत्तर को उत्कीर्ण किया, क्योंकि यह सही और उपयोगी है, लेकिन मैं खुद को एक ऐसे मामले में डिजाइन करने के खिलाफ सलाह देता हूं जहां आपको इसका दृढ़ता से विचार करना चाहिए।

आपके मामले में, आपके पास एक ही फ़ॉर्म के लिए कई सबमिट बटन हैं, लेकिन जब आप छवि अपलोड करते हैं तो आप वास्तव में फ़ॉर्म सबमिट नहीं कर रहे होते हैं। क्लाइंट-साइड सत्यापन को रोकने के लिए, आप "रद्द करें" वर्ग का उपयोग कर सकते हैं जैसा कि आपने पहले ही संकेत दिया है, लेकिन मैं दूसरे फॉर्म में 2 सबमिट बटन रखने की भी सलाह देता हूं, इस स्थिति में यह आपके मुख्य फॉर्म पर कोई सत्यापन नहीं करता है।

विभिन्न रूप का उपयोग करने का एक दूसरा फायदा है: आप इसे एक अलग ActionResult विधि पर भेज सकते हैं जो छवि अपलोड करने के तर्क को संभाल लेगा। यह अलग विधि बस मॉडल राज्य की "इस्लेवली" संपत्ति की जांच करने के लिए परेशान नहीं करेगी: यह केवल परवाह करता है अगर छवि में जानकारी है, और जिसे अलग से जांचा जा सकता है। (यहां तक ​​कि अगर आप एक ही ActionResult विधि का उपयोग करते हैं, तो आप तर्क को फ़नल कर सकते हैं ताकि आप मॉडल राज्य की अवैध संपत्ति पर भरोसा न करें।)

यदि आपको मॉडल स्थिति से त्रुटियों को स्पष्ट करना चाहिए, और यह उन सभी को स्पष्ट करने के लिए समझ में आता है, तो यह प्रयास करें:

foreach (var key in ModelState.Keys)
{
    ModelState[key].Errors.Clear();
}

यह आपको प्रमुख नामों को सही होने के आधार पर बनाए रखता है, लेकिन मूल्यों को संरक्षित रखता है जो किसी भी मूल्य (वैध या अमान्य) मॉडल में पहले से मौजूद हैं।

इन मामलों में जाँच करने के लिए एक अंतिम बात यह है कि क्या आपके पास ऐसे मूल्य हैं जो कभी-कभी केवल दृश्य में होते हैं, जो क्लाइंट-साइड सत्यापन (वे दृश्य में नहीं हैं) का कारण नहीं बनेंगे, लेकिन सर्वर-साइड सत्यापन समस्याओं में परिणाम करते हैं। इस स्थिति में, @ Html.HiddenFor (model => model.PropertyName) का उपयोग करना सबसे अच्छा है, यदि आप मान सकते हैं कि मान पहले ही सेट किया जा चुका है, तो यह इस दृश्य में दिखाई नहीं देता है।


7

मैं कभी-कभी इसका उपयोग करता हूं, इसलिए मैंने इसके लिए एक विस्तार विधि बनाई है:

public static ModelStateDictionary ClearError(this ModelStateDictionary m, string fieldName)
{
    if (m.ContainsKey(fieldName))
        m[fieldName].Errors.Clear();
    return m;
}

यह कई क्षेत्रों के लिए त्रुटि को स्पष्ट करने के लिए धाराप्रवाह उपयोग किया जा सकता है।


3

मॉडल से त्रुटि को दूर करने के लिए ModelState.Remove ("{key}") का उपयोग करें, जो ModelState को रीसेट कर देगा। सत्य के लिए अमान्य

ModelState.Remove("{key}");
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.