BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース Web Forms vNext のモデルバインダ

Web Forms vNext のモデルバインダ

ブックマーク

原文(投稿日:2011/06/03)へのリンク

ASP.NET Web Form は死を宣告されたにも関わらず,いまだ人気の高いフレームワークだ。Microsoft も多額の投資を継続していて,Web Forms vNext では強く型付けされた双方向データバインディングなど,いくつかの領域で大幅な改善が行われている。

強い型付けを備えたデータコントロールでは,ModelType 属性が使用され,Eval をベースとしたデータバインディングは "<%# Item.Property %>" あるいは "<%# BindItem.Property%>" (子コントロールの場合) を使ったプロパティの直接参照に置き換えられる。この ModelType 属性が一度設定されれば,これらデータバインディングの表記においても IntelliSense が完全にサポートされる。コンパイル時のエラーチェック処理やパフォーマンスなどの改善も期待できる。さらには従来のバインディングロジックと違い,複雑な型を使用したり,必要に応じてドリルダウンすることも可能になる。

Web Form の双方向データバインディング形式は,もともと .NET 2.0 で導入されたものだ。ただし必ずしも好評ではなかった。(MIX 2011 で行われたプレゼンテーションでは,発表者の Damian Edwards 氏が参加者に対して,現在それを使用しているか尋ねたが,誰も手を挙げなかった。) デモの印象はよかったが使い勝手としてはむしろ悪かった,という点は Microsoft も認識している。

新しいモデルでは選択(select),挿入(insert),更新(update),削除(delete) の各メソッドがコントロールで公開され,外部のデータソースを使用する必要がなくなった。これらの強く型付けされたメソッド内にデータアクセスのロジックをカプセル化することができる。

コントロールがデータアクセスに関与していることについては,多少説明の必要があるだろう。例えばページングをオンにしてデータグリッドを使用する場合,選択 (select) メソッドは次の2パターンのいずれかを実行する必要がある。

  • コントロールが Skip と Take をコール可能なように IQuerable を返す。
  • IEnumerable を返して,startRowIndex,maximumRowIndex,totalRows のパラメータを公開する。

このデータバインディング形式は Entity Framework や nHibernate のような ORM フレームワークと特に相性がよい。IQuerable のサポートはオプションだが,利用できればさらに便利になる。

ModelState のコンセプトは APP.NET MVC から導入されたものだ。MVC や Entity Framework,WCF RIA サービスなどが使用する System.ComponentModel.DataAnnotations のバリデーション属性がいくつか流用されている。挿入(insert),更新(update),削除(delete) の各メソッドでは,バリデーション情報の取得と設定に ModelState オブジェクトが使用される。さらにビューでは,ValidationSummary クラスでモデル状態のエラー通知がサポートされるようになった。

もうひとつの興味深い変更は,バインディング関数で属性が使用されることだ。デモでは,クエリ文字列などの別ソースから値を読み込むためにモデル結合関数で属性を使うと説明されていた。コントロールは実行時にこれらの属性を参照して,適切なクエリ文字列やクッキー,ビュー状態,セッション,あるいはコントロールから値が取得されたことをチェックする。

IEnumerable<Customer> SelectCustomers( [QueryString] int? minAge)

この実行で使用されるバリューバインディングプロバイダには拡張性があり,MVC Futures ライブラリが行っているように,独自のセマンティクスを使用して自分自身の属性を容易に記述することができる。MVC それ自体のようなモデルバインディングプロバイダを独自に開発することも可能だ。

挿入(insert) メソッドには2種類のモデルバインディングが用意されている。

  • void InsertCustomer()
  • void InsertCustomer(Customer newRecord)

最初のバージョンは "明示的バインディング" と呼ばれるもので,開発者が手動でオブジェクトを作成し,モデルバインディングを起動する必要がある。2番目のバージョンはすべて自動的に処理され,バインディング式から生成された新たなオブジェクトへと渡される。バインディングの発生時期をすべてコントロールする必要がない限り,後者のメソッドを使用するべきだろう。

この記事に星をつける

おすすめ度
スタイル

BT