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

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

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

我不想使用Html助手验证摘要或验证消息。相反,我想检查错误,如果有,以特定的格式显示它们。在输入控件上,我还想检查特定的属性错误,并向输入添加一个类

另外,我使用的是Spark View引擎,但想法应该是一样的

所以我想我可以做一些像

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