RealPath:
WebPath:
2017/06/08 18:04 (JST) 更新
ルーティング >>

ルート設定

Contents

トップページで呼ばれるコントローラ・アクション

トップページ(http://localhost:xxx/)で呼ばれるコントローラ・アクションはデフォルトでは HomeController.Index になっていますが、
この挙動は App_Start/RouteConfig.cs の以下のコードにより設定されています。

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } // ★ココ
);

たとえばこれを以下のように書き換えた場合、

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Abc", action = "Xyz", id = UrlParameter.Optional } // ★ココを書き換え
);

トップページ(http://localhost:xxx/)で呼ばれるコントローラ・アクションは AbcController.Xyz になります。

アクションが受け取るパラメータ

App_Start/RouteConfig.cs に書かれている内容から想像が付くかと思うのですが、

routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}", // ★ココに注目
    ....

たとえば http://localhost:xxx/Hoge/Fuga/10 のような URL が呼ばれた場合、
HogeController.Fuga が呼ばれ、そのパラメータとして id10 として渡されます。

HogeController.Fuga が以下のように定義されていれば、

public clss HogeController
{
    public ActionResult Fuga(int id)
    {
    ....
}

Fuga メソッドの引数 id には 10 が入ることになります。

属性によるルート設定

ルート設定は RouteConfig.cs 内で定義するものなのですが、
RouteConfig.cs にて outes.MapMvcAttributeRoutes(); を呼び出しておくと、
コントローラクラス側の属性指定でもルート設定を行うことができます。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.MapMvcAttributeRoutes(); // ★これを追加
    ....

上記設定を行っておくと、コントローラ側で例えば以下のようにルート設定を行うことができます。
Controllers/SampleController.cs

[RoutePrefix("Foo")]
public class SampleController : Controller
{
    [Route("Bar")]
    [Route("Poke")]
    public ActionResult Piyo()
    {
        ....
    }
}

属性によるルート設定を行わない場合、このコントローラ・アクションはhttp://localhost:xxx/Sample/Piyo のリクエストがあった場合に呼ばれるものなのですが、今回は RoutePrefix および Route の属性指定があるため、

  • 実際には http://localhost:xxx/Foo/Bar のリクエストがあった場合に SampleController.Piyo は呼ばれることになります。
  • 同様に http://localhost:xxx/Foo/Poke のリクエストでも SampleController.Piyo が呼ばれます。(しれっと書いていますが Route 属性は複数指定できるのです)

RoutePrefix および Route についての踏み込んだ説明はここでは行いませんが、この例示だけでなんとなくの理解はできるかと思います。詳細はググって欲しい。すまない。

属性によるルート設定で絶対パス指定

コントローラ側の RoutePrefix 属性等に関わらず、アクション側で絶対パス的なルート設定を行うこともできます。

[RoutePrefix("Foo")]
public class SampleController : Controller
{
    [Route("~/Bar")] // ★ココに注目
    public ActionResult Piyo(int year, int month)
    {
        ....

ルート指定文字列の先頭を ~/ とすることにより、これが絶対パスとして解釈されます。(RoutePrefix 指定は無視される形となる)
この例では、 http://localhost:xxx/Bar のリクエストがあったときに SampleController.Piyo が呼ばれる形となります。

属性によるルート設定でパラメータを受け取る

さきほどの属性指定によりルートを設定したコントローラ・アクションにさらに加工を加えてみます。

[RoutePrefix("Foo")]
public class SampleController : Controller
{
    [Route("Bar/{year}/{month}")]
    public ActionResult Piyo(int year, int month)
    {
        ....
    }
}

このように波括弧で囲まれた項目をルート設定に含めることにより、その部分をリクエストパラメータとして受け取ることができます。
この例であれば、http://localhost:xxx/Foo/Bar/2010/8 のようなリクエストがあった場合、SampleController.Piyo が呼ばれ、引数 year には 2010 が、引数 month には 8 が入ることになります。