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

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

我不想使用 HTML 帮助器验证摘要或验证消息。相反,我想检查是否有错误,以及是否有错误以特定的格式显示。在输入控件上,我还想检查一个特定的属性错误,并向输入中添加一个类。

另外,我使用的是 Spark View 引擎,但是思路应该是一样的。

所以我想我可以..。

<if condition="${ModelState.Errors.Count > 0}">
DisplayErrorSummary()
</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" />

这只会在此属性有错误时添加错误 css 类。

145749 次浏览
<% ViewData.ModelState.IsValid %>

或者

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

对于特定的财产。

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

谢谢你,查德!为了显示与密钥相关的所有错误,下面是我得出的结论。由于某种原因,基本的 Html。ValidationMessage 助手只显示与键关联的第一个错误。

    <%= Html.ShowAllErrors(mykey) %>

帮手:

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

要从 ModelState 获取错误,请使用以下 Linq:

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

如果不知道是什么属性导致了错误,可以使用反射遍历所有属性:

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”的类型。

简化版 @ ChrisMcKenzie 的回答:

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

这将为您提供一个字符串,其中所有错误都以逗号分隔

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

这是 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>。从那里开始,你就可以很容易地利用这份名单做你想做的事情了。

enter image description here

我从 BrockAllen 的答案中得到了这个,它显示了有错误的键:

    var errors =
from item in ModelState
where item.Value.Errors.Count > 0
select item.Key;
var keys = errors.ToArray();

资料来源: https://forums.asp.net/t/1805163.aspx?Get+the+Key+value+of+the+Model+error