如何获取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。