2009-02-21 60 views
137

如何獲取視圖中的錯誤集合?如何獲取ASP.NET MVC中的模型狀態錯誤的集合?

我不想使用Html Helper驗證摘要或驗證消息。相反,我想檢查錯誤,並以任何格式顯示它們。另外在輸入控件上,我想檢查一個特定的屬性錯誤並向輸入添加一個類。

P.S.我正在使用Spark View Engine,但這個想法應該是一樣的。

所以我想我可以做這樣的事情......

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

....and also... 

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

.... 

或者類似的東西。

UPDATE

我的最終解決方案是這樣的:

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

這隻會增加出錯的CSS類,如果這個屬性有錯誤。

+1

的可能的複製[如何從ASP.Net MVC ModelState中所有的錯誤?(https://stackoverflow.com/questions/1352948/how-to-get-all-errors-from- asp-net-mvc-modelstate) – 2017-11-16 06:59:12

回答

199
<% ViewData.ModelState.IsValid %> 

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

和特定屬性...

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

問題 - 如何獲取特定屬性的錯誤? – 2009-02-21 16:25:46

+1

的ModelState中屬性是字典類型 的得到錯誤傳遞鍵名 ViewData.ModelState [「名稱」] – 2009-02-21 16:29:42

+0

關於「ViewData.ModelState [」屬性「錯誤」 這會拋出一個空引用異常如果沒有名稱爲「Property」的密鑰? 在閱讀錯誤之前首先檢查ViewData.ModelState [「屬性」]上的空值會更好嗎? – DaveH 2012-11-06 18:16:14

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); 
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」的類型。

22

這會給你一個字符串中的所有錯誤用逗號分隔

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

這裏是VB。

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

從上面放在一起幾個答案,這就是我最終使用:

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

相關問題