モデルバインディングは、厳密に型付けされたオブジェクトを作成するためにリクエストデータを使うことにより、コントローラのアクションを単純化する機能である。Jess Chadwick氏はMSDNの記事で、複雑なシナリオだけじゃなく、デフォルトのモデルバインダーが十分じゃないときに、カスタムモデルバインダーを作成するようにこの機能を掘り下げた。
ASP.NET MVCモデルバインディングとはなにか?これは以下のように有効化できる。 -
public ActionResult Create()
{
var product = new Product() {
AvailabilityDate = DateTime.Parse(Request["availabilityDate"]),
CategoryId = Int32.Parse(Request["categoryId"]),
Description = Request["description"],
Kind = (ProductKind)Enum.Parse(typeof(ProductKind),
Request["kind"]),
Name = Request["name"],
UnitPrice = Decimal.Parse(Request["unitPrice"]),
UnitsInStock = Int32.Parse(Request["unitsInStock"])
}
};
to be replaced with this -
public ActionResult Create(Product product)
{
// ...
}
ASP.NETは、クエリーストリングのパラメータ名と厳密に型付けされたオブジェクトのプロパティ名を自動的にマップする。これは、JSONでポストされた値もサポートしている。モデルバインディングは、 (コレクションのアイテムの特定にインデクサを使う)シンタックスに注意する必要はあるが、コレクションやネストされたオブジェクトのような高度なケースでも動作する。
モデルバインディングフレームワークを拡張したい場合、いくつかのケースでカスタムモデルバインダーを作成することができる。一般的な例としては、(バインダーがリクエストデータによって実行時に特定の実装を選択する必要がある場合など)ビジネスモデルとの厳密な連携が必要なインターフェイスや抽象クラスにバインドするときがあげられる。Jess氏の記事では、DefaultBindingProviderを継承して、必要に応じてビヘイビアをオーバーライドするだけで実現できることを示している。たとえば、カスタムモデルバインダーの単体テストをする方法は、Scott Hanselmann氏の記事であるDateTimeの分割 - ASP.NET MVCモデルバインダーの単体テストを参照して欲しい。