如何获取ASP.NET MVC中的模型状态错误的集合?

如何获取视图中的错误集合?

我不想使用Html Helpervalidation摘要或validation消息。 相反,我想检查错误,如果有任何显示在特定的格式。 另外在input控件上,我想检查一个特定的属性错误,并添加一个类到input。

PS我正在使用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

我的最终解决scheme如下所示:

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

这只会添加错误的CSS类,如果这个属性有错误。

 <% ViewData.ModelState.IsValid %> 

要么

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

和一个特定的财产…

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

为了从ModelState中获取错误,使用这个Linq:

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

@ ChrisMcKenzie的答案是 :

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

这将给你一个string与逗号分离的所有错误

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

谢谢乍得! 为了显示所有与密钥相关的错误,下面是我想到的。 出于某种原因,基本的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(); } 

这是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()) 

综合上面的几个答案,这就是我最终使用的:

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

validationErrors最终成为一个List<string> ,其中包含每个错误消息。 从那里,很容易做到你想要的清单。

在这里输入图像描述

如果您不知道哪个属性导致了错误,则可以使用reflection来遍历所有属性:

 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”的types。