2009-02-21 5 views
137

मैं दृश्य में त्रुटियों का संग्रह कैसे प्राप्त करूं?मैं एएसपी.नेट एमवीसी में मॉडल स्टेट त्रुटियों का संग्रह कैसे प्राप्त करूं?

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

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

तो मैं सोचा मैं कुछ की तरह कर सकता है ...

<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" /> 

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

+1

संभावित डुप्लिकेट [ASP.Net MVC modelState से सभी त्रुटियाँ प्राप्त करने के लिए कैसे?] (Https://stackoverflow.com/questions/1352948/how-to-get-all-errors-from- एएसपी-नेट-एमवीसी-मॉडलस्टेट) –

उत्तर

199
<% ViewData.ModelState.IsValid %> 

या

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

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

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

प्रश्न - मैं किसी विशिष्ट संपत्ति के लिए त्रुटि कैसे प्राप्त करूं? –

+1

ModelState संपत्ति त्रुटि पाने के लिए कुंजी नाम ViewData.ModelState [ "नाम"] –

+0

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

5

धन्यवाद चाड! कुंजी से जुड़े सभी त्रुटियों को दिखाने के लिए, मैं यहां आया हूं। कुछ कारणों से आधार 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(); 
    } 
55

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

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

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

+4

क्योंकि हम इस पर पुनरावृत्ति से शुरू करते हैं। मॉडेलस्टेट.केस, मुझे KeyNotFoundException की संभावना दिखाई नहीं दे रही है। मुझे लगता है कि चेक ओवरकिल होगा। –

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(); 
} 

कहां टी आपके "व्यूमोडेल" का प्रकार है।

28

@ChrisMcKenzie's answer का संक्षिप्त संस्करण:

var modelStateErrors = this.ModelState.Values.SelectMany(m => m.Errors); 
22

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

string validationErrors = string.Join(",", 
        ModelState.Values.Where(E => E.Errors.Count > 0) 
        .SelectMany(E => E.Errors) 
        .Select(E => E.ErrorMessage) 
        .ToArray()); 
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()) 
+1

यक .. खुशी है कि मैं वीबी का उपयोग नहीं कर रहा हूं;) – cyclical

1

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

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

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

enter image description here

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