IT業界のすみっこ暮らし

ふと気がついたときの記録

ASP.NET MVC:ModelStateのエラーメッセージ一覧を取得してJsonで渡す

普段Modelのバリデーションチェックをして、エラーを格納するとき、以下のようにエラーメッセージを入れて

ModelState.AddModelError("", "○○が見つかりません。再度お試しください。");

ViewでValidationSummaryやValidationMessageを使ってエラーメッセージを表示します。

@Html.ValidationSummary()
@Html.ValidationMessage("hoge")

が、Ajaxjsonの戻り値として処理を終えたModelStateのエラーメッセージだけを取得し、画面に表示したいときもあります。

ModelStateのエラーメッセージ一覧を取得する

Jsonで結果を渡すためのモデル

public class JsonResultModel
{
    public List<string> ErrorList { get; set; }

    public bool IsSuccess { get; set; }

    public CustomerBulkCreateViewModel()
    {
        ErrorList = new List<string>();
    }
}

アクション

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult CallAction(string id)
{
    var model = new JsonResultModel();
    
    // やりたい処理

    // modelStateにあるエラーメッセージを画面上に表示させるためにmodel.ErrorListに格納
    model.ErrorList = ModelState.Values.SelectMany(e => e.Errors.Select(er => er.ErrorMessage)).ToList();

    return Json(model, "text/json", Encoding.UTF8, JsonRequestBehavior.AllowGet);
}

手っ取り早くただのstringリストにエラーメッセージをぶち込みのも出きるけど、バリデーション処理をModelStateに集約しておくとロジック部分の汎用性も高まるし、MVC本来の機能も使えるので出来ればエラーを拾うのはModelStateを活用した方が良いと思います。