台場でTechDays2010のBoFに出てきたんです。2009の時とあわせて2度目です。相変わらず打ち合わせとかしないのにはヒヤヒヤです。4になっていろいろすごいじゃないですか。一応事前に書いておいたメモをブログにも載せておきます。メジャーな部分データ検証の方法がDataAnnotationsを基本にしたものになりました。これまで通りIDataErrorInfoを実装したものも有効ですが、ValidationAttributeをモデルまたはモデルプロパティに指定(ModelMetadataで外部に定義したものでも可能)して、DataAnnotationsModelValidatorを使用するようDefaultModelBinderが変更になっています。LinqBinaryModelBinderも標準実装に組み込まれたので、System.Data.Linq.Binary(SqlDbType.Timestampなど)をbase64でhiddenからポストしたときも、自動で復元されます!またLinqBinaryModelBinder、基底クラスのByteArrayModelBinder(byte[]を復元)もFuturesから昇格です。4で組み込まれるSystem.Web.IHtmlStringを使えるようにMvcHtmlStringクラスが導入されました。MvcHtmlStringのソースファイルを確認するととても勉強になります。すべてのヘルパーはstringではなく、このMvcHtmlStringを返すよう変更されています。%>としている場合、自動的にHtmlEncodeした結果がレンダリングされるので、今後はこれが主流になります(きっと)。4じゃない場合はこれまで通り、Html.Encode(string)を使いましょう。HTMLをレンダリングする場合(ヘルパーのレンダリングとかも)は、IHtmlStringとして渡しておきましょう。AcceptVerbsAttributeがHttpVerbs.Get/Post以外に、Put/Delete/Headにも対応するようになっています。Get/Post以外は通常、ブラウザからは送信されないですが、HtmlHelper.HttpMethodOverride()をformタグ内で呼んでおくことで、hiddenにX-HTTP-Method-Overrideという名前で、メソッドオーバーライドを保持するようになり、POSTを使ったHttpVerbsの上書きができるようになります。この辺の実装はHttpRequestExtensionsに用意されてるHttpRequestBaseに拡張メソッドとして実装しているGetHttpMethodOverride()がまるっと処理してくれるようになっています。しないとできない部分でした。ちなみに、RESTfulなController実装をするときに、これができないと、ブラウザからのリクエストと、その他のクライアントからのリクエストの処理を簡単に切り分けできなくてとても不便です。JsonResultを返すActionの場合、HttpVerbsがPOSTであることが基本条件になりました。セキュリティ的にゴニョゴニョらしいです。}Getなら↑これで大丈夫。修正:2010年3月9日DefaultControllerFactoryからRequestContextプロパティが無くなりました。依存性をなくすのはいいことです。その代わり、Controllerのインスタンスを生成するためのCreateControllerにRequestContextをパラメータとして渡すようになってます。Mockを作る時が楽ちんです。AreaをサポートするためにRouteData.Valuesで"area"が予約されるようになりました。自分仕様でこの名前の値を使ってる場合は変更しておきましょう。Html.Substituteは残念ながら使えなくなりました。クライアントサイド検証が標準で組み込まれてます。このクライアントサイドコードを生成するために、C#からJavaScriptを吐き出すScriptSharpが使われています。コード生成に興味がある方は、参照してみるといいんじゃないかと思います。Script#http://projects.nikhilk.net/ScriptSharpボスが最近似たようなのを見つけてはしゃいでました。JavaScripthttp://sharpkit.net/TemplateベースDynamicDataと同じようにTemplateベースのモデルレンダリングを実装したHtml.EditorForやDisplayFor、プロパティベースのレンダリングを行うTextBoxForやLabelForなんかも目が離せない便利機能です。System.ComponentModel.DisplayNameAttributeやUIHintAttributeを使ってカスタマイズもしやすくていいですね。注目機能ChildActionOnly属性HtmlHelperのRenderAction/Actionからの要求しか受け付けないようにするActionFilter。UrlParameter.OptionalRoute登録時にRouteData.Valuesにキーすら含ませないようにするオプション。Dive!一番注目したいのはASP.NETらしさをしっかり継承したProviderモデルへのリファクタリングです。マニアックな部分ですが、拡張性を考慮して、より自由どの高い開発を行えるよう沢山のフックポイントを提供するために実装されています。Model)→出力(View)というフローになるそれぞれのつなぎ部分で拡張できる感じです。MVCソースから"Provider"と付いているクラスを検索!ModelMetadataProvidersModelMetadataProviderAssociatedMetadataProviderEmptryModelValidatorProviderDataAnnotationsModelValidatorProviderModelMetadataを取得するためのプロバイダ。モデルやモデルプロパティに関するすべてのメタ情報。ModelValidatorProvidersModelValidatornProviderAssociatedValidatorProvider標準のValidationAttribute用のAttributeAdopterクラスとDataAnnotationsModelValidatorを管理。EmptryModelValidatorProviderDataAnnotationsModelValidatorProviderDataErrorInfoModelValidatorProviderIDataErrorInfoの実装に対するDataErrorInfoPropertyModelValidatorとDataErrorInfoClassModelValidatorを使って、検証の結果を取得する。ClientDataTypeModelValidatorProvider数値型に関するNumericModelValidator。DataAnnotationsModelValidatorProviderDataErrorInfoModelValidatorProviderClientDataTypeModelValidatorProviderIValueProviderNameValueCollectionValueProviderFormValueProviderRouteDataValueProviderQueryStringValueProviderHttpFileCollectionValueProviderModelBinderがモデルにデータをバインドするさいに、値を取得する際に利用する。データの出所がどこなのかをModelBinderは意識しなくてもいいんです。次に"Factory"とついたクラスを検索!DefaultControllerFactoryValueProviderFactoriesValueProviderFactoryFormValueProviderFactoryRouteDataValueProviderFactoryQueryStringValueProviderFactoryHttpFileCollectionValueProviderFactoryコントローラの生成用のControllerFactoryと、IValueProviderを実装したValueProviderFactoryたちの2種類です。これがリファクタリングした超重要な部分になります。後は、これらを利用したサンプルの紹介という流れです。Presenter↑これね。このサンプルそのものがWebアプリケーションになっていて、サンプルの実行そのものがプレゼンスライドの表示になるという仕掛けだったんですけど...。プロバイダモデルがうんぬんくらいからちょっとツマラナイ話になってしまいましたね。今回はコードに関する説明がごっそりできてないので、MVC2の良くなった部分がサンプルのどこにどう使われているのか、全然伝えられませんでした。Zipで圧縮したのをアップロードしてどうのこうのとか、実はパワポじゃないんだよとか、それ以前に何を伝えようとしてるのかが、伝えられてなかったです。ドン引きってこんな時に使うのかな。心が折れて、帰りのゆりかもめでは夕日が目に染みた。泣いてなんかないやい。Crashけど、魂を砕くことはできないぜ!また機会があったら、今回の教訓を生かし、もっと参加者に楽しんでもらえるよう的を絞ったプレゼン+コードにしようと思います。サンプルの説明を近いうちここにエントリしようと思います(ここ知らない参加者の方には申し訳ないですが)。LabsまだないけどいつかDimeCastsでビデオが公開されるに違いない。試すにあたり、何かしらプログラムが必要だろうと、昨日ハンサムスーツを見ながらシンプルブログ(全然ブログじゃないというのは本題じゃないYO!)を作ってみた。タイトルいれて本文入れるだけね。Templateはイマイチかも。TextBoxForなんかは新しいTemplateベースのDisplayForやEditorForに揃えてくれるともうちょっと素敵さが増すんじゃないかな~。DataAnnotationsでDisplayName属性を指定してもLabelForで展開しないとそこから表示名を取得してくれないじゃないっすか。Listテンプレートは面倒かもしれないけど、そうじゃないところはDataAnnotationsの属性を生かせるヘルパーを使った物に統一してもらいたいデス。UIHintでカスタムEditorTemplatesを指定しても効いてくれなくてちょっと切なかった。