ScottGu's blog translated by Chica @ Wankuma

ASP.NET MVC Preview 3 リリース

  

ASP.NET MVC frameworkのプレビュー3ビルドバージョンを今朝リリースしました。先月、 暫定のソースリリースで詳細をブログでも書かせて頂きましたが、プレビュー3リリースでは多数の変更点があります。今日のビルドでは先月分には含まれていない新機能や、更新および改善点、またVisual Studioとの統合やそのドキュメントなども含まれています。

統合されたASP.NET MVC Preview 3 セットアップ・パッケージ はここからダウンロードして頂けます。 ASP.NET MVC Preview 3 framework のソースコードおよびフレームワークの単体テストも ここからダウンロードすることができます。

コントローラ・アクション・メソッドの変更

ASP.NET MVC Preview 3 には April MVC ソース リリースのところで最初にお話したMVC Controller の変更点にいくらかの調整が加えれた形で含まれています。

アクションメソッドにある全てのロジックをvoidで返し、カプセル化するコントローラ・アクション・メソッドを引き続き書くことができます。例えば:

これは起動されると以下の様なHTMLを描画します。:

Preview 3 では、アクション・メソッドの結果を示し、その据え置き実行を可能にする "ActionResult"オブジェクトを返す方法が使用できるようになりました。 これによりアクションの単体テストが非常に簡単になります。(何かをモックする必要がありません。)また、構成や全体の実行コントロールフローが非常にきれいになります。

例えば、LINQ to SQL を参照アクション・メソッドで使用して、一連のProdcutオブジェクトをデータベースから取得し、Viewで描画したいものを示すことができます。以下のコードは"ViewData"の3つのピース("Title"や"CategoryName"のString型の値、ViewData.Modelオブジェクトとして引き渡される強く型付けされた一連の製品)をViewへ引き渡します。:

上記のActionResult 方式を使用する利点の1つとして、Controller アクションの単体テストを非常に簡単にします。(モックテストが不要です。)以下は上記の参照アクション・メソッドの動作を検証する単体テストです。

 

そうすることで、参照アクションに紐づけされたViewDataを使用して、\Views\Productsのサブディレクトリ内にリスポンスを描画する"Browse" ViewPageを書くことができます。:

/Products/Browse/Beverages URL を指定すると、以下のようなHTMLが(赤で囲まれた3つのViewData使用方法で)取得されます。:

(描画されるべきViewを表示するための)"ViewResult" リスポンスのサポートに加え、ASP.NET MVC Preview 3 では、"JsonResult" (AJAX JSON シリアライゼーションのシナリオ対応)、 "ContentResult" (Viewなしでコンテンツをストリーミングする場合)、HttpRedirect および RedirectToAction/Route の結果なども、新たに返せるようになっています。

全体のActionResult方式は拡張性があり(結果の型が独自で作成することが可能)、今後さらにビルドインの結果に対する型が追加されていく予定です。

改善されたHTML ヘルパー・メソッド

ASP.NET MVC Preview 3でHTMLヘルパー・メソッドが更新されました。バグ修正の他に、多くの利便性の改善が行われています。

自動の値ルックアップ

前回のプレビューリリースでは、HTMLヘルパーを呼び出した際に描画する値を必ず明示的に引き渡す必要がありました。例えば、<input type="text" value="some value"/> 要素に値を含みたい場合は、以下の様に書いていました。:

上記のコードは引き続き可能ですが、以下の様にも書くことができます:

HTMLヘルパーは、現在はデフォルトで、使用するProductNameのキーおよびプロパティ値の為に、Viewに引き渡されたViewData辞書およびModelオブジェクトの両方をチェックします。

SelectList およびMultiSelectList のViewModel

新しいSelectList および MultiSelectList のView-Model クラスが組み込まれたため、HTMLのドロップダウンやマルチセレクトのリストボックスの紐づけ(および現在の選択の管理など)にクリーンな方法が利用できるようになりました。フォームをきれいにする方法の1つとして、コントローラ・アクションにあるView-Modelオブジェクトをインスタンス化して、セットアップし、それらをフォーマット化および描画するためにViewData辞書に入れてViewへ引き渡します。

例えば、以下ではユニークなカテゴリオブジェクト一式を通してデータベースにSelectList View-Model クラスを作成しているところです。リスト内の各項目の値として"CategoryID"、それを表示する文字列として "CategoryName"を使用しようとしています。また、現在編集しているProductのCategoryIdへリストでの選択値を設定しようとしています。:

Viewの中で、ViewDataへ含めたいSelectListに対してドロップダウンを作成した場合、以下のコードを書くだけです。:

これにより、ランタイム時に、適切なドロップダウンに項目と選択肢が描画されるようになります。:

 

ビルドインのエラー検証に、HTMLヘルパーは対象となっておりませんが(これに対しては現在コードが必要です。)、将来的に表示されるようになりますので、フォーム編集が非常に簡単になります。

またASP.NET AJAXのヘルパー・メソッドも今後のプレビューリリースで表示されるようになり、最小限のコードでMVCアプリケーションにAJAXを統合することができるようになります。

URL ルーティングの改善点

ASP.NET MVC Preview 3 には、URLルーティング・システムの改善点が数多く含まれています。URLルーティングはWebのMVCフレームワークが正しく働くための一番"基本的な" コンポーネントの1つです。そのため、最初の方のプレビューではこのエリアが安定するように重視し時間をかけてきました。新しいURLルーティング・エンジンは、.NET 3.5 SP1で今夏出荷予定で、WebフォームおよびMVCリクエストの両方がサポートされます。ASP.NET MVC は、 .NET 3.5 SP1上で動作している時ビルドインの .NET 3.5 SP1ルーティング・エンジンが利用できるようになります。ASP.NET MVC は、またSP1システムではない場合でも動作する様に、独自のアセンブリのコピーも含まれます。

Preview 3 に含まれているURLルーティングの改善点には以下の様なものがあります。:

MapRoute() および IgnoreRoute() ヘルパー・メソッド

ASP.NET MVC Preview 3 には、新しく"MapRoute" および "IgnoreRoute" ヘルパー・メソッドが追加され、ルーティング・ルールの登録がより簡単になりました。MapRoute() は、新しいMVCルートルールをルートコレクションに簡単に追加できます。IgnoreRoute() では、特定のURLパターン(例えば、JavaScriptや画像などを対応するための ASP.NET にある.axd リソース)の処理を停止するようにURLルーティングで指定ことができます。

以下は、ASP.NET MVC プロジェクトを新規作成した時に、Global.asaxにあるデフォルトのRegisterRoutes() メソッドの例で、新しいこれらのヘルパー・メソッドがアクションで両方とも確認することができます。

MapRoute() ヘルパー・メソッドは、オーバーロードされ、2~4の引数を取ります。(ルート名、URLシンタックス、デフォルトのURL引数、URL引数の正規表現の規制)

システム内で複数の名前付きルートを登録する度に何度でもMapRoute()を呼び出すことができます。例えば、デフォルトの慣習ルールに加え、以下の様に"Products-Browse"の名前の付いたルーティング・ルールを追加することができます。:

そうすることで、URLを生成した時、この"Products-Browse" ルールをControllerやViewの中で明示的に参照することができます。例えば、Html.RouteLinkビュー・ヘルパーを使用して、以下の様に、ビュー・テンプレートでコードを使用して、"Products-Browse" ルールへリンクさせて、そこへ"Food"カテゴリ引数を引き渡したいことを示すことができます。

そうすると、このビュー・ヘルパーは、ルーティング・システムにアクセスして、以下の様に、適切なHTMLのハイパーリンクURLを出力します。(注:そのルート・ルールを使用したURLへのカテゴリ引数を自動で引数置換が行われている様子をご確認ください。)

また、(<a>のHTML要素を出力せず)単純に名前付きルートに対してURLを取得したい場合は、 代替え的に新しい Url.RouteUrl(routeName, values) をView内で使用することができます。

名前付きのルーティング・ルールに基づいてブラウザでリダイレクトさせるために、Controllerのベースクラス上で、 新しいRedirectToRoute(routeName, values)ヘルパー・メソッドを使用することもできます。

リッチなURL ルート・マッピング機能

ASP.NET MVC Preview 3 では新しいURLルート・マッピング機能が数多くサポートされています。現在は、 "-"、 "."、 ";" などの文字をルート・ルールの一部に使用することができます。

例えば、"-" セパレータを使用して、以下の様なルールで、URLをから言語やロケールの値をパースすることができます。

これにより起動された際には、ProductsController.Browseアクション・メソッドへ適切な"language"、"locale"、"category" 引数が引き渡されます。:

URL ルート・ルール URLの例 アクション・メソッドに引き渡される引数
{language}-{locale}/products/browse/{category} /en-us/products/browse/food language=en, locale=us, category=food
  /en-uk/products/browse/food language=en, locale=uk, category=food

もしくは、 URLの最後にファイル拡張子の型の"."を使用することで、描画をXMLまたはHTML形式のどちらにするかを決定することができます。:

これにより、"category" または"format" 引数が ProductsController.Browse アクション・メソッドに引き渡されます。

URL ルート・ルール URLの例 アクション・メソッドに引き渡される引数
products/browse/{category}.{format} /products/browse/food.xml category=food, format=xml
  /products/browse/food.html category=food, format=html

ASP.NET MVC Preview 3 はワイルドカードのルート・ルールもサポートしています。(これらはPreview 2でもありました。) 例えば、ルールに残り全てのURIコンテンツを名前付き引数としてアクション・メソッドに引き渡すことを示すことができます。

これは "contentUrl" 引数をWikiController.DisplayPage アクション・メソッドに引き渡します。:

URL ルート・ルール URLの例 アクション・メソッドに引き渡される引数
Wiki/Pages/{*contentUrl} /Wiki/Pages/People/Scott contentUrl="People/Scott"
  /Wiki/Pages/Countries/UK contentUrl="Countries/UK"

これらのワイルドカードのルートは、ブログ、Wiki、CMSなどコンテンツベースのシステムを見る場合には非常に便利です。

まとめ

本日のASP.NET MVC Preview 3 リリースには、多くの更新・改善点が含まれています。MVCのURLルーティングやController/Action プログラミング・モデルに対して確信を持ち始め、またこれらのエリアは非常によく調理され始めていると感じています。今後のプレビューリリースでは、よりハイレベルのプログラミングモデル部分、例えば、Views(HTMLヘルパー、検証ヘルパーなど)、AJAX、サブコントローラ、サイト構成、ログイン、 ユーザ識別、ユーザ認証、キャッシュの統合、スカフォールディングなどの改善点も徐々に確認していただけると思います。

また、ASP.NET MVC Preview 3 を使用して構築したアプリケーションのチュートリアルも先週から作成し始めており、数日中にまた投稿できればと思っています。これにより、ASP.NET MVC の使い始めるに際しても、また、ASP.NET MVC を使用したい場合にどのように全てをまとめればいいかについても、なんらかのアイディアを提供できると思います。

Hope this helps,

Scott

ScottGu's blog translated by Chica @ Wankuma 

※本翻訳に関しまして、Scottさんにはご了承頂いております。