2011-09-14 18 views
65

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

मैं अपने 'अपलोड छवि' एक के "शैली के नाम अभी नहीं" एक वर्ग मूल्य, इसलिए

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

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

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

का उपयोग कर कस्टम मॉडल त्रुटियों को जोड़ सकते हैं मैं मॉडल त्रुटियों को निकालने का साधन ढूंढ रहा हूं। क्या यह संभव है?

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

यहाँ है कि मैं क्या के साथ आया था:

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 
} 
+0

:, तो मैं इसे से बाहर एक विस्तार विधि कर दिया है।। इसमें शामिल है (कुंजी)) 'ऐसा लगता है कि जहां खंड अनावश्यक है, क्योंकि ModelState.Keys में प्रत्येक कुंजी का मॉडलस्टेट होगा। Keys.Contains (key) सत्य वापस आती है। –

+1

मैंने प्रश्न और टेक्स्ट को अद्यतन करने के लिए अद्यतन किया हैModelState.ContainsKey पर छोटी विधि, हालांकि आपकी धारणा में आपका गलत है। ये वही काम कर रहे हैं। –

+0

क्षमा करें, मैंने आपके जवाब को खराब या गलत समझाया होगा। आप सही हैं कि 'ModelState.ContainsKey (कुंजी)' और 'ModelState.Contains (कुंजी)' वही काम करते हैं, लेकिन मेरा मुद्दा यह है कि 'ModelState.Keys.ToList()' में सभी मान प्रकृति द्वारा निहित होंगे 'मॉडलस्टेट' में, इसलिए संपूर्ण 'कहां' खंड अनावश्यक है और प्रदर्शन धीमा कर देगा। मामूली बात, यद्यपि। –

उत्तर

116

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

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

यह वही है जो मैं ढूंढ रहा था। मैंने अपना चयनित उत्तर बदल दिया है (क्षमा करें एडम ट्यूलिपर)। –

+0

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

+0

बस अगर कोई सोच रहा था, तो यह 'ModelState.IsValid' –

55

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

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

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

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

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

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

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

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

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

4

मैं कभी-कभी इसका उपयोग करता हूं क्यों आप एक `कहाँ (कुंजी => ModelState.Keys कर रहे हैं

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

यह धाराप्रवाह कई क्षेत्रों के लिए त्रुटि स्पष्ट करने के लिए इस्तेमाल किया जा सकता

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