ルーティングの制御

ASP.NET MVC3におけるルーティングの方法についてまとめる。

ルーティングとは、URLとして与えられた文字列(セグメントと/から構成されている)で示されたページへと遷移する機構のことである。

大きく二通りの遷移が考えられる。
1.contller、actionメソッドを指定してアプリケーション内でページ遷移する方法。
2.外部のページへのリンクとして使用する方法。


ルーティングの設定の仕方
ルーティングの設定を行っているのはGlobal.asax中のRegisterRoutesメソッド内で行っている。
MVCであれば、下記の記述で定義を行う。

routes.MapRoutes("ルート名","URLの定義",URLの各パラメータの既定値);

複数の定義をこのメソッド内で定義することが可能であるが、定義する順番に注意が必要である。メソッドの中の上にある定義ほど優先されて実行される。


URLの定義の方法
下記のように{}を使用して記述する。

{controller}/{action}/{id}

また、特定の文字列を使用する方法もある。

X{controller}/{action}/{id}

上記の例ではcontrollerの名前がXから始まっていることが前提となっている。

{controller}/Index/{id}

上記の例であれば、actionのセグメントの内容がIndexであることを決定している。


既定値の定義
既定値の定義は下記のように行う。

new {controller = "Home",action = "Index"}

上記の例ではcontroller名にHome、action名にIndexを指定している。
URLで両者の値が与えられなかった場合はこの値が代入される。

既に述べたURLの定義における文字列の指定の方法と併用することも可能である。

routes.MapRoutes("例","hogehoge/{action}/{id}",new {controller = "Home",action = "Index"});

上記の例ではhogehogeというcontroller名が指定された際はHomeと読み替えてアクセスするという内容になる。
逆に言えばhogehogeというcontroller及びその中に定義されているactionには遷移することができないので注意が必要である。


既定値として定義してしまうと入力がないとその値が使用されてしまう。
入力がなかったら、空(null)として振舞わせたい場合はUrlParameter.Optionalを指定する。
この記述をした状態で既定値を指定する場合はactionメソッドの受け取りの段階で値を指定してやる。

public ViewResult Index(stirng id = "DefaultId")


セグメント数の上限をなくす方法
下記の記述をすると以後のセグメントを全てを単一のセグメントであるcatchallとして扱うことができる。

routes.MapRoutes("例","{controller}/{action}/{id}/{*catchall}",new {controller = "Home",action = "Index",id = UrlParameter.Optional});


URLの値の取得
URL中の文字列を取得することも可能である。

RouteData.Values["定義(actionやcontroller)"]

定義の中にはURLの定義の際に使用したcontroller、action等が入る。

Model Bindingを使用したViewへの値の受け渡し方
URLの定義で使用した文字列をactionメソッドの定義時に自動でバインドしてくるため、下記のような記述でもURL中のidを受け取ることが可能である。この例ではstring型で受け取っているが、intやDateTimeでも可能である。その際はidの値に"Hello"など型変換ができない値を入れないことが前提になるため、string型で受け取ってから型変換する方が安全と言える。

public ViewResult Index(string id)
{
ViewData["id"] = id;
return View();
}