メインメニューを開く

差分

ASP.NET MVC/ルーティング

2,994 バイト追加, 2014年3月7日 (金) 01:15
編集の要約なし
[[ASP.NET MVC]]における'''ルーティング’’’とは、リクエストURIを、あらかじめ決められたルールに基づいていくつかのパラメータに分解し、その内容に従って適切なコントローラ・クラスを選択、実行すること言う。ルーティング'''とは、リクエストURI(俗にいうURL)を、予め決められたルールに基づいていくつかの文字列に分解し、その内容に従って適切な[[コントローラクラス]]を選択し、[[アクションメソッド]]を実行すること言う。
== ルーティング設定 ==
ルーティング設定についてはASP.NET MVCアプリが格納されているディレクトリの「Global.asax」に記載されている。
Global.asaxの主要部分(Visual Studio 2010で自動生成した場合のデフォルト設定)
<source lang="csharp">
routes.MapRoute(
// ルート名
"Default",
 
// パラメーター付きの URL
"{controller}/{action}/{id}",
 
// パラメーターの既定値
new {
controller = "Home",
action = "Index",
id = UrlParameter.Optional
}
);
</source>
 
第1引数は基本的に何でもよいそうだ。あとから誰がみても意味の伝わるわかりやすいルーティング名前を書いておく。
 
重要なのは第2引数。URLをスラッシュ区切りでコントローラー名、アクション名、パラメーターの3つに分解するように設定している。
 
第3引数はコントローラー名、アクション名、パラメーターのそれぞれが省略された場合に設定されるデフォルト値を設定している。
 
この例では省略しているが第4引数以降もある。
色々あるのでググれ。
 
=== URLから引数を取得する ===
ASP.NET MVCではルーティング定義に従い、URL文字列からアクションに渡す引数を自動抽出してくれる。
 
たとえば下記のルーティング定義では、「 http://localhost/watch/abc 」というURLにアクセスすると、VideoContorollerクラスのWatchメソッドが呼ばれ、videoName引数に「abc」という文字列が格納されている。
<source lang="csharp">
routes.MapRoute(
"DefaultVideo", // ルート名 "{controller}watch/{action}/{idvideoName}", // パラメーター付きの URL← これ超重要。 new { controller = "HomeVideo", action = "IndexWatch", id = UrlParameter.Optional } // パラメーターの既定値
);
</source>
第1引数は基本的に何でもよいそうだ。上記の{videoName}の部分に入っている文字列を取得するには、Watchメソッドに同名の引数を用意しておくと自動的に渡される。<source lang="csharp">class VideoController : Controller{ public ActionResult Watch( string videoName // ←←←←← この変数名をあわせる ) { return new ContentResult() { ContentType = "text/plain", Content = "Video : Watch : " + videoName }; }}</source> === スラッシュを含む文字列の取得 ===ASP.NET MVCのルーティング定義で自動抽出される個々の引数には、基本的に半角スラッシュ「/」を含めることができない。URLエンコードしても無駄な抵抗。たとえば前述の例で「 「 http://localhost/watch/abc/123 」にアクセスすると404エラーとなる。
重要なのは第2引数。URLをスラッシュ区切りでコントローラー名、アクション名、パラメーターの3つに分解するように設定している。ただし、ルーティング定義の最後の変数名の頭に半角アスタリスク「*」を付けると、以降すべてが抽出される。これには半角スラッシュも含まれるので、半角スラッシュを含みたい引数は最後にもってくると良い。また、常に1個の引数だけとるようにしてアクションメソッド内で強引にパースするという荒技もある。 前述の例を以下のように修正するとvideoName変数にちゃんと「abc/123」という文字列が渡されると思う。<source lang="csharp"> routes.MapRoute( "Video", "watch/{*videoName}", // ← 頭にアスタリスク // これでURL文字列のwatch/以降の全部が // videoName変数に格納されるようになる new { controller = "Video", action = "Watch" } );</source>
第3引数はコントローラー名、アクション名、パラメーターのそれぞれが省略された場合に設定されるデフォルト値を設定している。すごいぜ[[stackoverflow.com]]<ref>http://stackoverflow.com/questions/591694/url-encoded-slash-in-url</ref>。
== 関連項目 ==
匿名利用者