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

これにより、カンマで区切られたすべてのエラーを含む1つの文字列が得られます

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 に答える
6

ありがとうチャド!キーに関連するすべてのエラーを表示するために、私が思いついたのは次のとおりです。何らかの理由で、ベースの Html.ValidationMessage ヘルパーは、キーに関連付けられた最初のエラーのみを表示します。

    <%= Html.ShowAllErrors(mykey) %>

Htmlヘルパー:

    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 に答える