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

Posted

技术标签:

【中文标题】如何在 ASP.NET MVC 中获取模型状态错误的集合?【英文标题】:How do I get the collection of Model State Errors in ASP.NET MVC? 【发布时间】:2010-10-09 01:37:28 【问题描述】:

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

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

附:我使用的是 Spark View Engine,但思路应该是一样的。

所以我想我可以做类似...

<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 类。

【问题讨论】:

How to get all Errors from ASP.Net MVC modelState?的可能重复 【参考方案1】:
<% ViewData.ModelState.IsValid %>

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

对于特定的属性...

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

【讨论】:

ModelState 属性为字典类型,获取传递键名 ViewData.ModelState["Name"] 的错误 关于 "ViewData.ModelState["Property"].Errors" 如果没有名为 "Property" 的键,这会引发空引用异常吗?在读取错误之前先检查 ViewData.ModelState["Property"] 上的 null 会更好吗? @DaveH 是的,你应该先检查是否存在【参考方案2】:

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

【讨论】:

【参考方案3】:

要从 ModelState 中获取错误,请使用此 Linq:

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

【讨论】:

如果没有指定名称的键,这会抛出空引用异常吗?在读取错误之前先检查 ViewData.ModelState[key] 上的 null 会更好吗? 因为我们从迭代 this.ModelState.Keys 开始,我看不到 KeyNotFoundException 的可能性。我认为检查将是矫枉过正。【参考方案4】:

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

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

【讨论】:

【参考方案5】:

@ChrisMcKenzie's answer的精简版:

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

【讨论】:

【参考方案6】:

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

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

【讨论】:

这是我在整个列表中发现的唯一实际打印出错误的东西!谢谢【参考方案7】:

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

【讨论】:

【参考方案8】:

将上面的几个答案放在一起,这就是我最终使用的:

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

validationErrors 最终成为包含每个错误消息的List&lt;string&gt;。从那里,您可以轻松地使用该列表做您想做的事情。

【讨论】:

【参考方案9】:

从对我有用的 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

【讨论】:

以上是关于如何在 ASP.NET MVC 中获取模型状态错误的集合?的主要内容,如果未能解决你的问题,请参考以下文章

从托管在 Azure 中的 Asp.net Core MVC Web App 获取“响应状态代码不表示成功:502(错误网关)”

在 asp.net mvc 模型中更新用户配置文件无效

如何在 ASP.NET MVC 中获取当前用户

asp.net mvc 中模型验证如何处理数组呢?

将模型传递给 ASP.NET Core MVC 中的视图

asp.net mvc 3 在模型上运行验证