代码之家  ›  专栏  ›  技术社区  ›  rmontgomery429

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

  •  141
  • rmontgomery429  · 技术社区  · 16 年前

    我不想使用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类。

    8 回复  |  直到 3 年前
        1
  •  216
  •   Chris Kooken    13 年前
    <% ViewData.ModelState.IsValid %>
    

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

    <% ViewData.ModelState["Property"].Errors %> // Note this returns a collection
    
        2
  •  62
  •   Chris McKenzie    14 年前

    var modelStateErrors = this.ModelState.Keys.SelectMany(key => this.ModelState[key].Errors);
    
        3
  •  31
  •   Community CDub    7 年前

    @ChrisMcKenzie's answer :

    var modelStateErrors = this.ModelState.Values.SelectMany(m => m.Errors);
    
        4
  •  29
  •   UshaP    11 年前

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

    string validationErrors = string.Join(",",
                        ModelState.Values.Where(E => E.Errors.Count > 0)
                        .SelectMany(E => E.Errors)
                        .Select(E => E.ErrorMessage)
                        .ToArray());
    
        5
  •  7
  •   Casey Crookston    7 年前

    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

        6
  •  6
  •   Rake36    14 年前

        <%= 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();
        }
    
        7
  •  2
  •   MaylorTaylor    10 年前

    这是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
  •  0
  •   Gerard    11 年前

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

    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是“视图模型”的类型。

        9
  •  0
  •   Sushmit Saxena    4 年前

    从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