きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

ASP.NET MVC : 組み込みのヘルパを使わずにバリデーションのメッセージを取得する

確認環境:ASP.NET MVC 5.1(VS2013)

ビューに対して何らかの検証エラーを返した際、当然ですがビューではその内容を表示してあげることになると思います。

スキャフォールディングで作成したビュー等で利用されている通り、組み込みのHTMLヘルパを利用して簡単に表示することもできます。また自分でHTMLを一から組み立てて出力したり、オリジナルのヘルパを作成することも可能です。

 

組み込みのHTMLヘルパを使う場合

ASP.NET MVCでは、バリデーションの結果を表示するために、以下のヘルパが用意されています。

  • Html.ValidationSummary
  • Html.ValidationMessage
  • Html.ValidationMessageFor<>

 

例えば、コントローラーから以下のようにエラーを設定したとします。

public class HomeController : Controller
{
    public ActionResult Index()
    {
        ModelState.AddModelError("foo", "error for foo");
        ModelState.AddModelError("bar", "error for bar");
        ModelState.AddModelError("hoge", "error for hoge");
        return View();
    }
}

 

ビューにはヘルパを使って下記のように書いてみます。

<fieldset>
    <legend>Html.ValidationSummary</legend>
    @Html.ValidationSummary()
</fieldset>

<fieldset>
    <legend>Html.ValidationMessage</legend>
    @Html.ValidationMessage("foo")<br />
    @Html.ValidationMessage("bar")<br />
</fieldset>

 

上記の場合、実行結果のHTMLは以下のようになります*1

<fieldset>
    <legend>Html.ValidationSummary</legend>
    <div class="validation-summary-errors" data-valmsg-summary="true">
        <ul>
            <li>error for foo</li>
            <li>error for bar</li>
            <li>error for hoge</li>
        </ul>
    </div>
</fieldset>

<fieldset>
    <legend>Html.ValidationMessage</legend>
    <span class="field-validation-error" data-valmsg-for="foo" data-valmsg-replace="true">error for foo</span><br />
    <span class="field-validation-error" data-valmsg-for="bar" data-valmsg-replace="true">error for bar</span><br />
</fieldset>

 

 

組み込みHTMLヘルパを使わず自力で出力

多くの場合は組み込みのHTMLヘルパを利用すれば事足るかもしれません。が、例えば、出力するHTMLをフルにカスタマイズする必要に迫られることもあるかもしれません。

そのような場合、ViewDataModelStateプロパティ(ModelStateDictionary型)の中身を直接読み取ることで、バリデーションエラーの内容を取得することができます。

 

たとえば以下のようにすると、積み込まれているバリデーション エラーを列挙することができます。

<fieldset>
    <legend>ViewData.ModelStateから抽出</legend>
    @{
        foreach (var key in ViewData.ModelState.Keys)
        {
            foreach (var e in ViewData.ModelState[key].Errors)
            {
                <span>@key : @e.ErrorMessage</span><br />
            }
        }
    }
</fieldset>

 

出力されるHTMLは以下のようになります

<fieldset>
    <legend>ViewData.ModelStateから抽出</legend>
    <span>foo : error for foo</span><br />
    <span>bar : error for bar</span><br />
    <span>hoge : error for hoge</span><br />
</fieldset>

アプリ内で再利用するようであれば、カスタムのHTMLヘルパを作成してもよいですね。

 

サンプルソース

サンプルソースgithubに置いておきました。 kiyokura/MvcValidationSample01

*1:若干、改行とインデントを修正しています