जवाबों:
के बारे में "यह हो सकता है कि 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.isValid की जाँच करते हैं और ModelState के ऊपर मंडराते हैं। अब आप आसानी से अंदर के सभी मूल्यों के माध्यम से ब्राउज़ कर सकते हैं और देख सकते हैं कि किस त्रुटि के कारण आईवैलिड रिटर्न गलत है।
var asdf = ModelState.Values.Where(v => v.Errors.Count > 0);
आपकी मदद कर सकते हैं
अपने नियंत्रक के ActionResult में नीचे दिए गए कोड को पेस्ट करें और डीबगर को इस बिंदु पर रखें।
var errors = ModelState
.Where(x => x.Value.Errors.Count > 0)
.Select(x => new { x.Key, x.Value.Errors })
.ToArray();
bool hasErrors = ViewData.ModelState.Values.Any(x => x.Errors.Count > 1);
या इसके साथ पुनरावृति
foreach (ModelState state in ViewData.ModelState.Values.Where(x => x.Errors.Count > 0))
{
}
कभी-कभी कोई बाइंडर बिना किसी त्रुटि संदेश के अपवाद को फेंक देता है। आप निम्न स्निपेट के साथ अपवाद को पुनः प्राप्त कर सकते हैं ताकि पता चल सके कि क्या गलत है:
(अक्सर यदि बांधने वाला तार को जटिल प्रकारों में बदलने की कोशिश कर रहा है)
if (!ModelState.IsValid)
{
var errors = ModelState.SelectMany(x => x.Value.Errors.Select(z => z.Exception));
// Breakpoint, Log or examine the list with Exceptions.
}
यदि आप ModelState.IsValid के लिए चेक निकालते हैं और इसे त्रुटि करते हैं, यदि आप इस लाइन ((System.Data.Entity.Validation.DbEntityValidationException)$exception).EntityValidationErrors
को कॉपी करते हैं और इसे विजुअल स्टूडियो में वॉच सेक्शन में पेस्ट करते हैं तो यह आपको वही देगा जो त्रुटि है। बहुत समय की जाँच करता है कि त्रुटि कहाँ है।
कंट्रोलर पर ModelState प्रॉपर्टी वास्तव में एक ModelStateDictionary वस्तु है। आप शब्दकोश पर कुंजियों के माध्यम से पुनरावृत्ति कर सकते हैं और यह जांचने के लिए कि विशिष्ट क्षेत्र मान्य है, IsValidField विधि का उपयोग करें।