508

キーの値を知らなくても、modelState からすべてのエラー メッセージを取得したいと考えています。ModelState に含まれるすべてのエラー メッセージを取得するためにループします。

これどうやってするの?

4

20 に答える 20

607

LINQ の使用:

IEnumerable<ModelError> allErrors = ModelState.Values.SelectMany(v => v.Errors);
于 2011-02-08T15:07:03.703 に答える
579
foreach (ModelState modelState in ViewData.ModelState.Values) {
    foreach (ModelError error in modelState.Errors) {
        DoSomethingWith(error);
    }
}

ASP.NET MVC でモデル状態エラーのコレクションを取得する方法も参照してください。.

于 2009-08-30T04:41:15.493 に答える
215

すべてのエラー メッセージを 1 つの文字列に結合する場合は、LINQ バージョンに基づいて構築します。

string messages = string.Join("; ", ModelState.Values
                                        .SelectMany(x => x.Errors)
                                        .Select(x => x.ErrorMessage));
于 2011-10-22T17:05:41.477 に答える
38

少しLINQを使用してこれを行うことができましたが、

public static List<string> GetErrorListFromModelState
                                              (ModelStateDictionary modelState)
{
      var query = from state in modelState.Values
                  from error in state.Errors
                  select error.ErrorMessage;

      var errorList = query.ToList();
      return errorList;
}

上記のメソッドは、検証エラーのリストを返します。

参考文献 :

ASP.NET MVC で ModelState からすべてのエラーを読み取る方法

于 2012-12-01T16:01:33.150 に答える
19

デバッグ中に、すべてのModelStateエラーを表示するために、各ページの下部にテーブルを配置すると便利です。

<table class="model-state">
    @foreach (var item in ViewContext.ViewData.ModelState) 
    {
        if (item.Value.Errors.Any())
        { 
        <tr>
            <td><b>@item.Key</b></td>
            <td>@((item.Value == null || item.Value.Value == null) ? "<null>" : item.Value.Value.RawValue)</td>
            <td>@(string.Join("; ", item.Value.Errors.Select(x => x.ErrorMessage)))</td>
        </tr>
        }
    }
</table>

<style>
    table.model-state
    {
        border-color: #600;
        border-width: 0 0 1px 1px;
        border-style: solid;
        border-collapse: collapse;
        font-size: .8em;
        font-family: arial;
    }

    table.model-state td
    {
        border-color: #600;
        border-width: 1px 1px 0 0;
        border-style: solid;
        margin: 0;
        padding: .25em .75em;
        background-color: #FFC;
    }
 </style>
于 2012-12-15T02:41:57.070 に答える
16

これまでの回答のアドバイスに従ったことがわかったように、エラーメッセージが設定されていなくても例外が発生する可能性があるため、すべての問題をキャッチするには、ErrorMessage と Exception の両方を取得する必要があります。

String messages = String.Join(Environment.NewLine, ModelState.Values.SelectMany(v => v.Errors)
                                                           .Select( v => v.ErrorMessage + " " + v.Exception));

または拡張メソッドとして

public static IEnumerable<String> GetErrors(this ModelStateDictionary modelState)
{
      return modelState.Values.SelectMany(v => v.Errors)
                              .Select( v => v.ErrorMessage + " " + v.Exception).ToList();

}
于 2013-01-16T16:24:00.033 に答える
7

エラーメッセージ自体を出力するだけでは不十分でしたが、これでうまくいきました。

var modelQuery = (from kvp in ModelState
                  let field = kvp.Key
                  let state = kvp.Value
                  where state.Errors.Count > 0
                  let val = state.Value?.AttemptedValue ?? "[NULL]"

                  let errors = string.Join(";", state.Errors.Select(err => err.ErrorMessage))
                  select string.Format("{0}:[{1}] (ERRORS: {2})", field, val, errors));

Trace.WriteLine(string.Join(Environment.NewLine, modelQuery));
于 2016-09-08T22:54:11.163 に答える
4

そして、これも機能します:

var query = from state in ModelState.Values
    from error in state.Errors
    select error.ErrorMessage;
var errors = query.ToArray(); // ToList() and so on...
于 2012-07-31T00:36:50.283 に答える
4

おそらく Json を介して、エラー メッセージの配列を View に渡すのに役立ちます。

messageArray = this.ViewData.ModelState.Values.SelectMany(modelState => modelState.Errors, (modelState, error) => error.ErrorMessage).ToArray();
于 2013-03-25T10:19:36.780 に答える
4

これは @Dunc からの回答を拡張しています。xml ドキュメントのコメントを参照してください

// ReSharper disable CheckNamespace
using System.Linq;
using System.Web.Mvc;


public static class Debugg
{
    /// <summary>
    /// This class is for debugging ModelState errors either in the quick watch 
    /// window or the immediate window.
    /// When the model state contains dozens and dozens of properties, 
    /// it is impossible to inspect why a model state is invalid.
    /// This method will pull up the errors
    /// </summary>
    /// <param name="modelState">modelState</param>
    /// <returns></returns>
    public static ModelError[]  It(ModelStateDictionary modelState)
    {
        var errors = modelState.Values.SelectMany(x => x.Errors).ToArray();
        return errors;            
    }
}
于 2013-10-11T21:08:12.020 に答える
3

また、ModelState.Values.ErrorMessage空の場合もありますがModelState.Values.Exception.Message、エラーを示している場合があります。

于 2012-10-01T18:26:26.153 に答える