そうです、これは実際のモデルバインディングです。
次のようなHtmlHelpersを使用すると、バインディングはほぼ自動的に発生します。
@Html.TextboxFor(model => model.PropertyName)
この行は実際には次のようなものを少し作成します:
<input type="textbox" id="Modelobject_PropertyName" name="ModelObject.PropertyName" />
次に、フォームを送信するDefaultModelBinder
と、POST値を逆シリアル化し、指定されたタイプのオブジェクトを作成して作成できます(少なくとも試行します)。対応するエントリが見つからない場合、プロパティはnullになり、エントリの場合はnullになります。対応するプロパティがない場合、無視されます(他のパラメータがない場合)。
この記事は少し古いものですが、それでもかなり正確です。
例として:
単純なオブジェクトがあるとしましょう:
public class IndexModel
{
public string MyProperty { get; set; }
public bool MyCheckbox { get; set; }
}
シンプルなコントローラー:
public class TestingController : Controller
{
[OutputCache(Duration=0, NoStore = true)]
public ActionResult Index()
{
return View(new IndexModel { MyProperty = "hi" });
}
[HttpPost]
[OutputCache(Duration=0, NoStore = true)]
public ActionResult Index(IndexModel model)
{
model.MyProperty += "!";
ModelState.Clear();
return View(model);
}
}
そして簡単なビュー:
@model MvcApp.Models.IndexModel
@using (Html.BeginForm())
{
<div>
@Html.LabelFor(model => model.MyProperty)<p />
@Html.TextBoxFor(model => model.MyProperty)
</div>
<div>
@Html.LabelFor(model => model.MyCheckbox)<p />
@Html.CheckBoxFor(model => model.MyCheckbox)
</div>
<input type="submit" />
}
フォームを送信すると、モデルが完全に再作成されていることがわかります。
プロパティの実際の値を表示したくないが、それでも永続化する必要がある場合:
@Html.HiddenFor(model => model.MyProperty)
これにより、ポストバックされて永続化される非表示フィールドが生成されます。
ハッピーコーディング!