Html 如何在ASP.NET MVC中获取模型状态错误集合?
如何获取视图中的错误集合 我不想使用Html助手验证摘要或验证消息。相反,我想检查错误,如果有,以特定的格式显示它们。在输入控件上,我还想检查特定的属性错误,并向输入添加一个类 另外,我使用的是Spark View引擎,但想法应该是一样的 所以我想我可以做一些像Html 如何在ASP.NET MVC中获取模型状态错误集合?,html,asp.net-mvc,validation,spark-view-engine,Html,Asp.net Mvc,Validation,Spark View Engine,如何获取视图中的错误集合 我不想使用Html助手验证摘要或验证消息。相反,我想检查错误,如果有,以特定的格式显示它们。在输入控件上,我还想检查特定的属性错误,并向输入添加一个类 另外,我使用的是Spark View引擎,但想法应该是一样的 所以我想我可以做一些像 <if condition="${ModelState.Errors.Count > 0}"> DispalyErrorSummary() </if> ....and also... <inp
<if condition="${ModelState.Errors.Count > 0}">
DispalyErrorSummary()
</if>
....and also...
<input type="text" value="${Model.Name}"
class="?{ModelState.Errors["Name"] != string.empty} error" />
....
DispalyErrorSummary()
……而且。。。
....
或者类似的
更新
我的最终解决方案如下所示:
<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 %>
或
x.Errors.Count>=1)%>
对于一个特定的属性
<% ViewData.ModelState["Property"].Errors %> // Note this returns a collection
//注意,这将返回一个集合
谢谢Chad!为了显示与该键相关的所有错误,下面是我想到的。出于某种原因,base Html.ValidationMessage帮助程序仅显示与该键相关的第一个错误
<%= Html.ShowAllErrors(mykey) %>
要仅从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();
}
public静态字符串ShowAllErrors(此HtmlHelper帮助程序){
StringBuilder sb=新的StringBuilder();
类型myType=类型(T);
PropertyInfo[]propInfo=myType.GetProperties();
foreach(propInfo中的PropertyInfo属性){
foreach(helper.ViewData.ModelState[prop.Name].Errors中的变量e){
标记生成器div=新标记生成器(“div”);
div.MergeAttribute(“类”,“字段验证错误”);
div.SetInnerText(例如ErrorMessage);
某人附加(div.ToString());
}
}
使某人返回字符串();
}
其中T是“视图模型”的类型。压缩版本:
这将为您提供一个字符串,其中包含逗号分隔的所有错误
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
最终成为包含每个错误消息的列表。从那以后,你就可以很容易地用这个列表做你想做的事情
从BrockAllen对我有用的答案中得到,它显示有错误的键:
var errors =
from item in ModelState
where item.Value.Errors.Count > 0
select item.Key;
var keys = errors.ToArray();
来源:ModelState属性属于字典类型,用于获取传递键名ViewData的错误。ModelState[“name”]关于“ViewData.ModelState[“property”]”。错误“如果没有名为“property”的键,这会引发空引用异常吗?”?在读取错误之前,是否最好先检查ViewData.ModelState[“Property”]上是否存在null?@DaveH Yep,您应该首先完全检查是否存在。如果没有具有指定名称的键,这是否会引发null引用异常?在读取错误之前,最好先检查ViewData.ModelState[key]是否为null?因为我们从迭代this.ModelState.Keys开始,所以我看不到KeyNotFoundException的可能性。我认为这项检查太过分了。这可能是我在整个列表中发现的唯一一个可以打印出错误的东西!谢谢
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();
var errors =
from item in ModelState
where item.Value.Errors.Count > 0
select item.Key;
var keys = errors.ToArray();