ひっそりと生きるプログラマのブログ

日頃気になった事なりを書き留めるブログです。関心ごとは多くもう少し更新頻度を上げたいところです。

【ASP.NET MVC】モデルのバインドに関して

ポストする時に同じ name があった場合、
どのような挙動となるのか確認しました。
※自分自身のメモです。時間も遅いのでわかり辛かったらすみません。。。

次のような Controller と View があるとします。

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View("Index");
    }

    public ActionResult Send(bool a)
    {
        return this.Index();
    }
}

※ submit すると HomeController クラスの Send メソッドが呼ばれます。

@using (Html.BeginForm("Send", "Home", null, FormMethod.Post))
{
    <input type="checkbox" name="a" value="true" />
    <input type="hidden" name="a" value="false" />
    <input type="submit" value="送信" />
}

checkbox を チェック した状態で引数 a には true が設定されます。
また、
checkbox を チェック しない状態で引数 a には false が設定されます。

これは、name が複数同じ値が存在した場合、
先に読み込まれた値を元に解決しているようです。
その為、以下のような実装も可能となります。

@using (Html.BeginForm("Send", "Home", null, FormMethod.Post))
{
    <input type="text" name="a" />
    <input type="checkbox" name="a" value="true" />
    <input type="hidden" name="a" value="false" />
    <input type="submit" value="送信" />
}

type が text の入力値が bool型へ変換できない場合は実行時例外が発生します。
文字列そてい、 "true" および "false" と入力した場合は、
入力した値が bool 型へ変換され引数 a に設定されます。

この事から、上から下へ順に解決されている事が確認できました。