2008年7月18日金曜日

やったねPreview 4!

一部で話題沸騰中のASP.NET MVCですが、Preview 4が出ましたね! 教えてくれたナオキさんに感謝デス!

ASP.NET - Release: ASP.NET MVC CodePlex Preview 4 Installer + Source

さっそくダウンロードしてインストール。Preview 3のアンインストールが必須です。

で、今回のリリースでどこがどう変わったのか気になるよね! イロイロ変わってるみたいですが、Preview 3からの変更点はそれほど大きくなくて、実装してるものはほぼそのまま移行できるというすぐれものです。 ただし!ViewDataは手を加える必要があるくらい変わりましたね。

例えば。 Page(aspx)でUserControl(ascx)をHtml.RenderUserControlでレンダリングするとき、第2引数にViewDataを指定しないなら、そのままUserControl(ascx)でもViewDataが参照できます。 ここまでは今まで通り。

じゃ、ViewDataとして匿名クラスを渡した場合どうなるでしょ?

<% = Html.RenderUserControl("~/Views/UserControls/MyControl.ascx", new {Val1=1,Val2="弐"}) %>

↑こんな時ね。あるよね?ない?

今までは上記のMyControl.ascx内で参照するとき(int)ViewData["Val1"]とか(string)ViewData["Val2"]で参照できたとことが、Preview 4になってからはそれができなくなりました。 デバッガでどうなってるのか見てみると、上記のような場合でもViewData.Modelに値が入ってしまうんですね。でも、待って下さい、匿名クラスなんですが! そうね、UserControl内でキャストしようにもできませぬ。

そんな時はViewDataDictionaryクラスに新しく追加されたEval関数を使いましょう! 上記の例で行くと(int)ViewData.Eval("Val1")とか、(string)ViewData.Eval("Val2")って具合です。 ※もっといい書き方あるかもしれないけど...。

匿名クラスをViewDataとして渡すという書き方自体があまりオーソドックスじゃないかもしれないけど、新しくクラスを作るほどでもなく、複数の値をUserControlに渡したいというものぐさな人にはピッタリ(自分)。 今回のPreview 4で感激したのがAuthorizeAttributeとHandleErrorAttribute。いずれのフィルターもControllerのActionどっちでも使えて楽ちんぽん!

Ajax 的な処理の部分はprototype.jsを使ってるので、改めてMicrosoft Ajax Libraryを使う気にはなれないけど、Microsoft Ajax Libraryが標準装備(scriptタグは自分で書かなきゃダメだけど)になってて、Ajax.Formなんかで部分更新(UserControlのレンダリングは見つからないけど)なんかも簡単にできるようになってますね。

Scott Hanselman's Computer Zen - ASP.NET MVC Preview 4 - Using Ajax and Ajax.Form

あとはね~、そうだな~、そうだ!TempDataがSerializableになりました!TempDataProviderっていうのを実装すれば、Sessionじゃないところにも入れれるけど、そこまではちょっと...。単体テスト向け? これで自分で作ったFlashDataなんていうクラスも使わなくて済むかも!と、思ったけど、TempDataに入れたのがずっとSessionで残ったままになってて意味ないじゃん!みたいな。 ※StateServer指定して試しました。 ↑ちゃんと消えました。 すいません。

HomeControllerでのテスト。 1.HomeController.Index TempDate["Message"]=”Test”; 2.Home.aspx <%= TempData["Message"] %> 3.About.aspx <%= TempData["Message"] %>

↑こんな感じで実行すると、Homeではもちろん表示されます。

で、"About us"リンクをクリックすると、Aboutでも表示されます。 もう一度"About us"リンクをクリックすると、今度は消えてます。 1の処理でTempDataに値を入れます。で、2の処理は同じパイプラインでの実行なので、そのまま表示されます。その後、同じパイプラインでTempDataProvider.SaveTempDataでセッションに保持。 一回目のAbout表示の時にTempDataProvider.LoadTempDataでセッションから取り出し、セッションをクリア。で、取り出したのを表示するから、ちゃんと出る。でも2回目のAbout表示ではセッションから消しちゃってるから表示されませんね。 あってます!自分が処理間違ってました!さーせん!TempData最高!

AccountControllerは結構普通だったのがちょっと残念かも。 そうそう、最初に生成されるSite.Masterのcharsetが相変わらずiso-8859-1なのは、なんか意味があるんだろうか。 ちなみに今回のリリースで一番感動するのが「ASP.NET MVC API Changes From Preview 3 to CodePlex Preview 4」というタイトルのソースの変更箇所一覧が書かれてるPDF。超感動。前回は差分がどこかわかんなくて苦労したけど、今回はこれがあるから大丈夫(だと思います)!