DataAnnotationsでエラーメッセージを取得したい


Objective-CとかPython+Djangoの記事がアップされる中あえてASP.NETを取り上げてみたいと思います。

何やってる会社なんだよという気になる方は是非弊社までお問い合わせください。

今回は、通常のフォーム上に表示する方法ではなくコントローラー上で取得してJSONでエラーを返すみたいなことを想定しています。


ASP.NETを使ってアプリを作っているのですが、データの検証にDataAnnotationsを利用しています。

ViewModelを定義すると、Modelに対応するフォームとかバリデートを勝手にやってくれるので大変便利です。

MS様ありがとうと感謝してもしきれません。

ただこのAjaxへのレスポンス時にはエラーメッセージどうやって取るのよってことになりまして、MSDN調べてみても見つからなかったので結局自作してみました。



public ActionResult Hoge(Fuga viewModel)
{
    JavaScriptResult res = new JavaScriptResult();

    if (ModelState.IsValid)
    {
        res.Script = renderJson(true, "成功したよ。");
        return res;
    }
    else
    {
        res.Script = renderJson(false, getErrorMessage(ModelState));
        return res;
    }
}

まずはこんなメソッドを想定します。AjaxでPOSTされたデータを検証、処理をしてレスポンスを返します。

通常ですと、ViewModelを引き渡すのですがAjaxという都合上JSONに変換するためにgetErrorMessage()というメソッドを作成しました。


public string getErrorMessage(System.Web.Mvc.ModelStateDictionary ModelStateDictionary)
{
    string res = "";
    foreach(System.Web.Mvc.ModelState ModelState in ModelStateDictionary.Values){
         if (ModelState.Errors.Count != 0)
         {
             foreach (System.Web.Mvc.ModelError error in ModelState.Errors)
             {
                if (res == "")
                {
                     res += error.ErrorMessage;
                 }
                else
                {
                    res += Environment.NewLine + error.ErrorMessage;
                }
            }
        }
    }
  return res;
}

中身はこんな感じです。ModelStateDictionaryの各要素をエラーがないかチェックして、あったら文字列に突っ込んで返すという単純な内容です。これくらい標準で用意しておいて欲しいです。(もしあったら済みません)
こんな感じで車輪の再発明的な事を細々と書きたいと思います。

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>