しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

ASP.NET MVC 3 で個人的に気になる機能

どんなブログよりも赤シャツ男ブログ ScottGu's Blog が一番わかりやすいです。

ScottGu's Blog - Introducing ASP.NET MVC 3 (Preview 1)

個人的に気になっているのは以下の機能

  1. Razor View Engine
  2. Global Filters
  3. Dynamic ViewModel
  4. HttpNotFoundResult, HttpStatusCodeResult
  5. JsonValueProvider

Razor View Engine

既に Razor に関してはいろんな人が書いてるのでそっちで。System.Web.Mvc.WebViewPage がスーパークラスなのね、という感じ。
そういえば、Razor には aspx のマスタページに相当する機能は WebViewPage の LayoutPage プロパティと RenderBody メソッドで代替する感じですか。サイドバー項目を動的に切り替えたいときには RenderSection メソッドと @section 記法を使ってオーバーライドすればいいらしい。

まあ、こっちを読んでくださいということで。

ScottGu's Blog - Introducing “Razor” – a new view engine for ASP.NET

追記

LayoutPage に指定したテンプレート内で定義したセクションを、同じファイル内で RenderSection しようとするとエラーが発生します。下記のように Layout.cshtml 内にデフォルトのセクションを定義しておいて、Index.cshtml でのオーバーライドは出来ないようです。

Layout.cshtml

<div id="side-menu">
@RenderSection("menu");
</div>

@section menu {
<ul>
    <li>login</li>
</ul>
}

Index.cshtml

@section menu {
<ul>
    <li>register</li>
</ul>
}

セクションが存在するかによって、とあるレイアウト要素を丸ごと隠したい場合には WebViewPage に IsSectionDefined メソッドが用意されてるので、セクションが定義されているかを判別出来ます。いい感じです。

@if (IsSectionDefined("menu")) {
<div class="box">
    @RenderSection("menu", optional: true);
</div>
}

Global Filters

これは便利だと思う。デフォルトのコントローラテンプレートは HandleError とか付いてないので自分で付けないといけないし、Application_Start で登録できるのでデバッグ時にはもっと細かいログを出すフィルタを適用させることもできる。

使い方はルーティング登録と同じような感じ。きっとテンプレートにはコメントとかで書いてあるでしょう。

Dynamic ViewModel

これで ViewModel をいちいち作る必要がなくなったかな。パフォーマンスが多少気になるけど、ViewData では扱えるのが object 型だったのでいちいちキャストが必要だった。これを利用しない手はない。

しっかし、dynamic 型を使うとインテリセンスに頼りっきりの私にゃ厳しい。ある程度推論してくれないかしらと思ってしまう。

追記

調べていると PageData という IDictionary なコレクションを発見しました。ViewModel は Model の dynamic 版、PageData は ViewData の dynamic 版といったところでしょうか。

HttpNotFoundResult, HttpStatusCodeResult

今まで無かった方がおかしいレベルですね。仕方なく私は ActionResult を返さないアクションを定義して Response.StatusCode を直接弄ってました。EmptyResult は意味が違うからなぁ。

HttpNotFoundResult は HttpNotFound ヘルパーメソッドが用意されてるみたいですが、HttpStatusCodeResult に関しては記述がないのとまだ MVC 3 を入れてないので未検証です。誰か教えてください。

追記

HttpNotFound しかヘルパーメソッドはありませんでした。HttpStatusCodeResult を使うには自分で new するか、ヘルパーメソッドを作るのがいいと思います。

JsonValueProvider

アクションの引数にはランタイムが自動的に値をバインドしてくれますが、JSON の値でもバインド出来るようになったらしいです。

JSON を使うことで配列やハッシュを使うことが出来るので、XHR を使っている場合で便利になると思います。

まとめ

今回は Preview 1 ということで RTM までには無くなったり、変わったりする機能もあると思うのですが楽しみに待ちたいですね。

ちなみに DI は個人的にまったく興味がないのでパス。