RealPath:
WebPath:
2017/09/02 14:01 (JST) 更新
ルーティング >>

属性ルーティング

Contents

コントローラへの属性ルーティング

コントローラクラス定義に Route 属性を付けることにより、デフォルト以外のルートを設定することができる。

例えば HelloController.World というアクションはデフォルトでは http://..../Hello/World という URL でアクセスできるものだが、この HelloController に [Route("foo/[action]")] という属性を付与した場合、前述の URL は無効となり、代わりに http://..../foo/World という URL で HelloController.World アクションが呼ばれる形となる。

/Controller/HelloController.cs
[Route("foo/[action]")]
public class HelloController : Controller
{
    // http://..../foo/World
    public IActionResult World()
    {
        return View();
    }
}

アクションへの属性ルーティング

アクションメソッド定義に Route 属性を付けることにより、アクション名部分のルートも変更することができる。

例えば HelloController.World というアクションはデフォルトでは http://..../Hello/World という URL でアクセスできるものだが、この HelloController の World メソッドに [Route("bar")] という属性を付与した場合、前述の URL は無効となり、代わりに http://..../bar という URL で HelloController.World アクションが呼ばれる形となる。

/Controllers/HelloController.cs
public class HelloController : Controller
{
    // http://..../bar
    [Route("bar")]
    public IActionResult World()
    {
        return View();
    }
}

コントローラ・アクションへの属性ルーティング同時指定

コントローラおよびアクション両方に Route 属性を付けることもできる。

/Controllers/HelloController.cs
[Route("foo")]
public class HelloController : Controller
{
    // http://..../foo/bar
    [Route("bar")]
    public IActionResult World()
    {
        return View();
    }
}

Route 属性による絶対パス指定

前述の例のように、アクションに付与した Route 属性の引数値は、コントローラ側の Route からの相対パスとして認識されるが、Route 属性の引数の先頭に ~/ を付けることにより、引数値を絶対パスとして認識させることもできる。

/Controllers/HelloController.cs
[Route("foo")]
public class HelloController : Controller
{
    // http://..../foo/bar
    [Route("bar")]
    public IActionResult World()
    {
        return View();
    }

    //「~/」を付けることにより、コントローラ側の「foo」指定を無視して
    // 絶対パスとして「/piyo」ルートを設定することができる。
    //
    // http://..../piyo
    [Route("~/piyo")]
    public IActionResult OtherWorld()
    {
        return View();
    }
}

Route 属性の並列付与

同一コントローラまたは同一アクションに対して複数の Route 属性を付与することもできる。

例えば以下の HelloController.World は「http://..../foo/bar」「http://..../abc」「http://..../hoge/fuga」の3種類の URL いずれからもアクセスすることができる。

/Controllers/HelloController.cs
[Route("foo")]
public class HelloController : Controller
{
    [Route("bar")]
    [Route("~/abc")]
    [Route("~/hoge/fuga")]
    public IActionResult World()
    {
        return View();
    }
}