ASP.NET MVC/ルーティング

提供: MonoBook
移動: 案内検索

ASP.NET MVCにおけるルーティングとは、リクエストURI(俗にいうURL)を、予め決められたルールに基づいていくつかの文字列に分解し、その内容に従って適切なコントローラクラスを選択し、アクションメソッドを実行すること言う。

ルーティング設定[編集]

ルーティング設定についてはASP.NET MVCアプリが格納されているディレクトリの「Global.asax」に記載されている。

Global.asaxの主要部分(Visual Studio 2010で自動生成した場合のデフォルト設定)

routes.MapRoute(
    // ルート名
    "Default", 
 
    // パラメーター付きの URL
    "{controller}/{action}/{id}",
 
    // パラメーターの既定値
    new {
        controller = "Home",
        action = "Index", 
        id = UrlParameter.Optional 
    } 
);

第1引数は基本的に何でもよいそうだ。あとから誰がみても意味の伝わるわかりやすいルーティング名前を書いておく。

重要なのは第2引数。URLをスラッシュ区切りでコントローラー名、アクション名、パラメーターの3つに分解するように設定している。

第3引数はコントローラー名、アクション名、パラメーターのそれぞれが省略された場合に設定されるデフォルト値を設定している。

この例では省略しているが第4引数以降もある。 色々あるのでググれ。

URLから引数を取得する[編集]

ASP.NET MVCではルーティング定義に従い、URL文字列からアクションに渡す引数を自動抽出してくれる。

たとえば下記のルーティング定義では、「 http://localhost/watch/abc 」というURLにアクセスすると、VideoContorollerクラスのWatchメソッドが呼ばれ、videoName引数に「abc」という文字列が格納されている。

            routes.MapRoute(
                "Video",
                "watch/{videoName}",  // ← これ超重要。
                new { controller = "Video", action = "Watch" }
            );

上記の{videoName}の部分に入っている文字列を取得するには、Watchメソッドに同名の引数を用意しておくと自動的に渡される。

class VideoController : Controller
{
    public ActionResult Watch(
        string videoName // ←←←←← この変数名をあわせる
    )
    {
        return new ContentResult() {
            ContentType = "text/plain",
            Content = "Video : Watch : " + videoName
        };
    }
}

スラッシュを含む文字列の取得[編集]

ASP.NET MVCのルーティング定義で自動抽出される個々の引数には、基本的に半角スラッシュ「/」を含めることができない。URLエンコードしても無駄な抵抗。たとえば前述の例で「 「 http://localhost/watch/abc/123 」にアクセスすると404エラーとなる。

ただし、ルーティング定義の最後の変数名の頭に半角アスタリスク「*」を付けると、以降すべてが抽出される。これには半角スラッシュも含まれるので、半角スラッシュを含みたい引数は最後にもってくると良い。また、常に1個の引数だけとるようにしてアクションメソッド内で強引にパースするという荒技もある。

前述の例を以下のように修正するとvideoName変数にちゃんと「abc/123」という文字列が渡されると思う。

            routes.MapRoute(
                "Video",
                "watch/{*videoName}",  // ← 頭にアスタリスク
                                       //    これでURL文字列のwatch/以降の全部が
                                       //    videoName変数に格納されるようになる
                new { controller = "Video", action = "Watch" }
            );

すごいぜstackoverflow.com[1]

関連項目[編集]

参考文献[編集]

  1. http://stackoverflow.com/questions/591694/url-encoded-slash-in-url

外部リンク[編集]