ModelState.IsValid == गलत, क्यों?


120

मुझे उन त्रुटियों की सूची कहां मिल सकती है जो मॉडलस्टेट को अमान्य बनाते हैं? मुझे ModelState ऑब्जेक्ट पर कोई त्रुटि गुण दिखाई नहीं दिया।

जवाबों:


45

के बारे में "यह हो सकता है कि 0 त्रुटियां और IsValid == false": यहाँ https://github.com/Microsoft/referencesource/blob/master/System.Web/ModelBinding/ModelStateDictionary.cs#L37-L41 से MVC स्रोत कोड है

public bool IsValid {
    get {
        return Values.All(modelState => modelState.Errors.Count == 0);
    }
}

अब, ऐसा लगता है कि यह नहीं हो सकता। खैर, यह ASP.NET MVC v1 के लिए है।


यह मुझे लगता है कि यह नहीं होना चाहिए, क्या यह वैल्यू में कुछ गलत है। सभी (modelState => modelState.Errors.Count == 0)?
ओमू

ध्यान दें कि त्रुटि संदेश या अपवाद हो सकती है; उदाहरण के लिए Html.ValidationSummary अपवादों को नहीं दिखाता (सुरक्षा कारणों से मुझे लगता है); शायद इसीलिए आपको त्रुटियां नहीं दिखतीं? बिना किसी त्रुटि के आप कैसे जांच करेंगे?
रानी 3

1
ModelState.IsValid झूठा देता है
Omu

हा-हा, यह स्पष्ट है ... आप "मूल्यों में 0 त्रुटियां हैं" की जांच कैसे करते हैं?
रानी ३

258

जैसा कि आप शायद विज़ुअल स्टूडियो में प्रोग्रामिंग कर रहे हैं, तो आप ऐसे आसान डिबगिंग चरणों के लिए ब्रेकप्वाइंट का उपयोग करने की संभावना का लाभ उठा सकते हैं (एक विचार प्राप्त करना कि आपके मामले में समस्या क्या है)। बस उन्हें सिर्फ सामने / उस जगह पर रखें जहाँ आप ModelState.isValid की जाँच करते हैं और ModelState के ऊपर मंडराते हैं। अब आप आसानी से अंदर के सभी मूल्यों के माध्यम से ब्राउज़ कर सकते हैं और देख सकते हैं कि किस त्रुटि के कारण आईवैलिड रिटर्न गलत है।

modelstate


3
क्या यह संभव हो सकता है कि सभी मानों में 0 त्रुटियां हों और मॉडलस्टेट अभी भी अमान्य हो?
ओमू

जैसा कि ऊपर कहा गया है, नहीं यह संभव नहीं है :)। कहीं एक त्रुटि गणना होनी चाहिए! = 0।
बास्टजेन

2
एक ऐड के रूप में, अगर ErrorMessage आपके लिए अस्पष्ट है, तो आप कुंजियों पर जा सकते हैं और यह आपको दिखाएगा कि यह किस चर का उल्लेख कर रहा है।
चमकदार

1
अपने दृश्य में, करें: @ Html.HiddenFor (मॉडल => model.Username) समस्या को हल करेगा!
उदित काया

1
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);आपकी मदद कर सकते हैं
Cirelli94

37

अपने नियंत्रक के ActionResult में नीचे दिए गए कोड को पेस्ट करें और डीबगर को इस बिंदु पर रखें।

var errors = ModelState
    .Where(x => x.Value.Errors.Count > 0)
    .Select(x => new { x.Key, x.Value.Errors })
    .ToArray();

3
यहां सबसे अच्छा उत्तर, उच्च दर्जा दिया जाना चाहिए। क्यों मैं अपना समय डिबगर में ModelState ऑब्जेक्ट की 5 परतों के माध्यम से खोदने में बिताता हूं, जब मैं केवल त्रुटियों को प्राप्त कर सकता हूं। अगर मैं उच्चतम रेटिंग वाले उत्तर का अनुसरण करता हूं, तो मैं पूरी सुबह वहां
सीन टी

2
यह सबसे अच्छा कभी है
खिलौना

23
bool hasErrors =  ViewData.ModelState.Values.Any(x => x.Errors.Count > 1);

या इसके साथ पुनरावृति

    foreach (ModelState state in ViewData.ModelState.Values.Where(x => x.Errors.Count > 0))
    {

    }

क्या यह संभव हो सकता है कि सभी मानों में 0 त्रुटियां हों और मॉडलस्टेट अभी भी अमान्य हो?
ओमू

1
मॉडलस्टेट में कुंजी "गुण" और शब्दकोश में एक संबद्ध त्रुटि होगी। त्रुटि संदेश रिक्त हो सकता है, लेकिन त्रुटि गणना उस संपत्ति की संख्या को प्रतिबिंबित करेगी जो अमान्य हैं। क्योंकि ModelStateDictionary.AddModelError विधि एक कुंजी लेता है, और अपवाद या त्रुटि स्ट्रिंग; एक मॉडल त्रुटि जोड़ना आवश्यक है।
माइकल जी

13

कभी-कभी कोई बाइंडर बिना किसी त्रुटि संदेश के अपवाद को फेंक देता है। आप निम्न स्निपेट के साथ अपवाद को पुनः प्राप्त कर सकते हैं ताकि पता चल सके कि क्या गलत है:

(अक्सर यदि बांधने वाला तार को जटिल प्रकारों में बदलने की कोशिश कर रहा है)

 if (!ModelState.IsValid)
            {
var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));

// Breakpoint, Log or examine the list with Exceptions.

  }

1
यह कोड मेरे लिए बहुत उपयोगी था, लेकिन प्रत्येक को प्राप्त करने के लिए त्रुटियों (अपवाद) को पुनरावृत्त करना। मेसेज का परिणाम "ऑब्जेक्ट संदर्भ एक ऑब्जेक्ट की आवृत्ति पर सेट नहीं किया गया" था। जब मैंने z.Exception को z.ErrorMessage में बदल दिया तो मैं त्रुटि संदेशों को प्रदर्शित करने में सक्षम था।
StackOverflowUser

यह मेरे लिए समाधान था, z.ErrorMessage में बदल रहा था, हालांकि मुझे z.Exception के साथ कोई त्रुटि नहीं मिली, बस शून्य मान। शायद मूल उत्तर को अपडेट करने लायक।
esp

5

यदि आप ModelState.IsValid के लिए चेक निकालते हैं और इसे त्रुटि करते हैं, यदि आप इस लाइन ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrorsको कॉपी करते हैं और इसे विजुअल स्टूडियो में वॉच सेक्शन में पेस्ट करते हैं तो यह आपको वही देगा जो त्रुटि है। बहुत समय की जाँच करता है कि त्रुटि कहाँ है।


1
वास्तव में सहायक टिप।
ऐश

यह इस धागे में सबसे अच्छी सलाह है। समस्या मैं एक बेवकूफ था "।" (डॉट) UserName में
mangia

3

कंट्रोलर पर ModelState प्रॉपर्टी वास्तव में एक ModelStateDictionary वस्तु है। आप शब्दकोश पर कुंजियों के माध्यम से पुनरावृत्ति कर सकते हैं और यह जांचने के लिए कि विशिष्ट क्षेत्र मान्य है, IsValidField विधि का उपयोग करें।


3

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


1
मेरे साथ ऐसा हुआ। टिप के लिए Thx!
लुईस 86
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.