150

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

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

PS 我使用的是 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 类。

4

9 回答 9

216
<% ViewData.ModelState.IsValid %>

或者

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

对于特定的属性...

<% ViewData.ModelState["Property"].Errors %> // Note this returns a collection
于 2009-02-21T16:21:12.343 回答
63

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

var modelStateErrors = this.ModelState.Keys.SelectMany(key => this.ModelState[key].Errors);
于 2010-08-11T14:46:03.187 回答
31

@ChrisMcKenzie 答案的精简版:

var modelStateErrors = this.ModelState.Values.SelectMany(m => m.Errors);
于 2014-01-08T22:51:54.727 回答
29

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

string validationErrors = string.Join(",",
                    ModelState.Values.Where(E => E.Errors.Count > 0)
                    .SelectMany(E => E.Errors)
                    .Select(E => E.ErrorMessage)
                    .ToArray());
于 2014-03-10T16:18:04.557 回答
7

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

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

validationErrors最终成为List<string>包含每个错误消息的 a 。从那里,很容易用那个列表做你想做的事。

在此处输入图像描述

于 2017-05-31T17:12:29.243 回答
6

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

这里是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())
于 2015-02-12T14:43:44.800 回答
0

如果您不知道导致错误的属性,您可以使用反射循环所有属性:

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

于 2013-10-23T13:00:28.830 回答
0

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

于 2020-10-27T09:37:28.157 回答