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

Rya*_*ery 145 html validation asp.net-mvc spark-view-engine

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

我不想使用Html Helper验证摘要或验证消息.相反,我想检查错误,如果有任何显示特定格式.另外在输入控件上我想检查特定的属性错误并在输入中添加一个类.

PS我正在使用Spark View Engine,但这个想法应该是一样的.

所以我想我可以做点像......

<if condition="${ModelState.Errors.Count > 0}">
  DispalyErrorSummary()
</if>

....and also...

<input type="text" value="${Model.Name}" 
       class="?{ModelState.Errors["Name"] != string.empty} error" />

....
Run Code Online (Sandbox Code Playgroud)

或类似的东西.

UPDATE

我的最终解决方案如下所示:

<input type="text" value="${ViewData.Model.Name}" 
       class="text error?{!ViewData.ModelState.IsValid && 
                           ViewData.ModelState["Name"].Errors.Count() > 0}" 
       id="Name" name="Name" />
Run Code Online (Sandbox Code Playgroud)

如果此属性有错误,则仅添加错误css类.

Cha*_*ran 210

<% ViewData.ModelState.IsValid %>
Run Code Online (Sandbox Code Playgroud)

要么

<% ViewData.ModelState.Values.Any(x => x.Errors.Count >= 1) %>
Run Code Online (Sandbox Code Playgroud)

对于特定的财产......

<% ViewData.ModelState["Property"].Errors %> // Note this returns a collection
Run Code Online (Sandbox Code Playgroud)


Chr*_*zie 61

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

var modelStateErrors = this.ModelState.Keys.SelectMany(key => this.ModelState[key].Errors);
Run Code Online (Sandbox Code Playgroud)

  • 因为我们首先迭代this.ModelState.Keys,所以我没有看到KeyNotFoundException的可能性.我认为检查会有点矫枉过正. (5认同)
  • 如果没有具有指定名称的密钥,是否会抛出空引用异常?在读入错误之前首先检查ViewData.ModelState [key]上的null会不会更好? (2认同)

Tod*_*ier 30

简明版@ ChrisMcKenzie的回答:

var modelStateErrors = this.ModelState.Values.SelectMany(m => m.Errors);
Run Code Online (Sandbox Code Playgroud)


Ush*_*haP 27

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

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


Rak*_*e36 6

谢谢乍得!为了显示与密钥相关的所有错误,这是我想出的.由于某种原因,基本Html.ValidationMessage帮助程序仅显示与该键关联的第一个错误.

    <%= Html.ShowAllErrors(mykey) %>
Run Code Online (Sandbox Code Playgroud)

的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();
    }
Run Code Online (Sandbox Code Playgroud)


Cas*_*ton 6

从上面汇总了几个答案,这就是我最终使用的内容:

var validationErrors = ModelState.Values.Where(E => E.Errors.Count > 0)
    .SelectMany(E => E.Errors)
    .Select(E => E.ErrorMessage)
    .ToList();
Run Code Online (Sandbox Code Playgroud)

validationErrors最终是一个List<string>包含每个错误消息的。从那里开始,使用该列表即可轻松完成所需的操作。

在此处输入图片说明