मुझे ASP.NET MVC में मॉडल स्टेट एरर्स का संग्रह कैसे मिलेगा?


145

मुझे एक दृश्य में त्रुटियों का संग्रह कैसे मिलेगा?

मैं Html हेल्पर सत्यापन सारांश या सत्यापन संदेश का उपयोग नहीं करना चाहता। इसके बजाय मैं त्रुटियों की जांच करना चाहता हूं और यदि कोई उन्हें विशिष्ट प्रारूप में प्रदर्शित करता है। इनपुट नियंत्रणों पर भी मैं एक विशिष्ट संपत्ति त्रुटि की जांच करना चाहता हूं और इनपुट में एक वर्ग जोड़ना चाहता हूं।

PS मैं स्पार्क व्यू इंजन का उपयोग कर रहा हूं लेकिन विचार समान होना चाहिए।

इसलिए मुझे लगा कि मैं कुछ कर सकता हूं ...

<if condition="${ModelState.Errors.Count > 0}">
  DispalyErrorSummary()
</if>

....and also...

<input type="text" value="${Model.Name}" 
       class="?{ModelState.Errors["Name"] != string.empty} error" />

....

या कुछ इस तरह का।

अपडेट करें

मेरा अंतिम समाधान इस तरह देखा गया:

<input type="text" value="${ViewData.Model.Name}" 
       class="text error?{!ViewData.ModelState.IsValid && 
                           ViewData.ModelState["Name"].Errors.Count() > 0}" 
       id="Name" name="Name" />

यह केवल त्रुटि सीएसएस वर्ग जोड़ता है यदि इस संपत्ति में त्रुटि है।


जवाबों:


210
<% ViewData.ModelState.IsValid %>

या

<% ViewData.ModelState.Values.Any(x => x.Errors.Count >= 1) %>

और एक विशिष्ट संपत्ति के लिए ...

<% ViewData.ModelState["Property"].Errors %> // Note this returns a collection

1
ModelState गुण कुंजी नाम को पास करने के लिए डिक्शनरी प्रकार का है। ViewData.ModelState ["Name"]

"ViewData.ModelState [" संपत्ति "] के बारे में। त्रुटियों" यह एक अशक्त संदर्भ अपवाद फेंक देगा अगर "संपत्ति" नाम के साथ कोई कुंजी नहीं थी? बेहतर होगा कि पहले ViewData.odelState ["संपत्ति"] पर त्रुटियों के लिए पढ़ने से पहले अशक्त के लिए जाँच करें?
डेविड होलोनेल -

@ डेव हां, आपको पहले अस्तित्व के लिए पूरी तरह से जांच करनी चाहिए
एलेक्स लेमन

61

सिर्फ ModelState से त्रुटियों को प्राप्त करने के लिए, इस Linq का उपयोग करें:

var modelStateErrors = this.ModelState.Keys.SelectMany(key => this.ModelState[key].Errors);

2
यदि यह निर्दिष्ट नाम के साथ कोई कुंजी नहीं है, तो क्या यह एक शून्य संदर्भ अपवाद को फेंक देगा? बेहतर होगा कि पहले ViewData.odelState [कुंजी] पर त्रुटियों के लिए पढ़ने से पहले त्रुटियों की जाँच करें?
डेविड होलोनेल -

5
क्योंकि हम इस पर चलने की शुरुआत करते हैं। ModelState.Keys, मुझे KeyNotForException की क्षमता नहीं दिख रही है। मुझे लगता है कि चेक ओवरकिल होगा।
क्रिस मैकेंजी


28

यह आपको कॉमा को अलग करने के साथ सभी त्रुटियों के साथ एक स्ट्रिंग देगा

string validationErrors = string.Join(",",
                    ModelState.Values.Where(E => E.Errors.Count > 0)
                    .SelectMany(E => E.Errors)
                    .Select(E => E.ErrorMessage)
                    .ToArray());

इस पूरी सूची में केवल यही एक चीज है जो वास्तव में त्रुटियों को छापती है! धन्यवाद
जेमी

6

धन्यवाद चाड! कुंजी से जुड़ी सभी त्रुटियों को दिखाने के लिए, यहाँ मैं क्या लेकर आया हूँ। किसी कारण से आधार Html.ValidationMessage सहायक केवल कुंजी से जुड़ी पहली त्रुटि दिखाता है।

    <%= Html.ShowAllErrors(mykey) %>

HtmlHelper:

    public static String ShowAllErrors(this HtmlHelper helper, String key) {
        StringBuilder sb = new StringBuilder();
        if (helper.ViewData.ModelState[key] != null) {
            foreach (var e in helper.ViewData.ModelState[key].Errors) {
                TagBuilder div = new TagBuilder("div");
                div.MergeAttribute("class", "field-validation-error");
                div.SetInnerText(e.ErrorMessage);
                sb.Append(div.ToString());
            }
        }
        return sb.ToString();
    }

6

ऊपर से कई उत्तरों को एक साथ रखना, यह वही है जो मैंने उपयोग किया है:

var validationErrors = ModelState.Values.Where(E => E.Errors.Count > 0)
    .SelectMany(E => E.Errors)
    .Select(E => E.ErrorMessage)
    .ToList();

validationErrorsसमाप्त हो रहा है List<string>कि प्रत्येक त्रुटि संदेश होता है। वहाँ से, यह आसान है कि आप उस सूची में क्या चाहते हैं।

यहाँ छवि विवरण दर्ज करें


2

यहां वीबी है।

Dim validationErrors As String = String.Join(",", ModelState.Values.Where(Function(E) E.Errors.Count > 0).SelectMany(Function(E) E.Errors).[Select](Function(E) E.ErrorMessage).ToArray())

0

यदि आपको नहीं पता कि किस संपत्ति में त्रुटि हुई है, तो आप सभी गुणों पर प्रतिबिंब, लूप का उपयोग कर सकते हैं:

public static String ShowAllErrors<T>(this HtmlHelper helper) {
    StringBuilder sb = new StringBuilder();
    Type myType = typeof(T);
    PropertyInfo[] propInfo = myType.GetProperties();

    foreach (PropertyInfo prop in propInfo) {
        foreach (var e in helper.ViewData.ModelState[prop.Name].Errors) {
            TagBuilder div = new TagBuilder("div");
            div.MergeAttribute("class", "field-validation-error");
            div.SetInnerText(e.ErrorMessage);
            sb.Append(div.ToString());
        }
    }
    return sb.ToString();
}

जहाँ T आपके "ViewModel" का प्रकार है।

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