キーの値を知らなくても、modelState からすべてのエラー メッセージを取得したいと考えています。ModelState に含まれるすべてのエラー メッセージを取得するためにループします。
これどうやってするの?
キーの値を知らなくても、modelState からすべてのエラー メッセージを取得したいと考えています。ModelState に含まれるすべてのエラー メッセージを取得するためにループします。
これどうやってするの?
LINQ の使用:
IEnumerable<ModelError> allErrors = ModelState.Values.SelectMany(v => v.Errors);
foreach (ModelState modelState in ViewData.ModelState.Values) {
foreach (ModelError error in modelState.Errors) {
DoSomethingWith(error);
}
}
ASP.NET MVC でモデル状態エラーのコレクションを取得する方法も参照してください。.
すべてのエラー メッセージを 1 つの文字列に結合する場合は、LINQ バージョンに基づいて構築します。
string messages = string.Join("; ", ModelState.Values
.SelectMany(x => x.Errors)
.Select(x => x.ErrorMessage));
少し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;
}
上記のメソッドは、検証エラーのリストを返します。
参考文献 :
デバッグ中に、すべての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>
これまでの回答のアドバイスに従ったことがわかったように、エラーメッセージが設定されていなくても例外が発生する可能性があるため、すべての問題をキャッチするには、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();
}
エラーメッセージ自体を出力するだけでは不十分でしたが、これでうまくいきました。
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));
そして、これも機能します:
var query = from state in ModelState.Values
from error in state.Errors
select error.ErrorMessage;
var errors = query.ToArray(); // ToList() and so on...
おそらく Json を介して、エラー メッセージの配列を View に渡すのに役立ちます。
messageArray = this.ViewData.ModelState.Values.SelectMany(modelState => modelState.Errors, (modelState, error) => error.ErrorMessage).ToArray();
これは @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;
}
}
また、ModelState.Values.ErrorMessage
空の場合もありますがModelState.Values.Exception.Message
、エラーを示している場合があります。