MVC 5の属性ルーティング
MVC 5以前routes.MapRoute(...)
は、RouteConfig.csファイルを呼び出すことで、URLを特定のアクションとコントローラーにマッピングできました。ここにホームページのURLが保存されます(Home/Index
)。ただし、次のようにデフォルトルートを変更すると、
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
これは他のアクションとコントローラーのURLに影響することに注意してください。たとえば、という名前のコントローラークラスがExampleController
あり、その中にアクションメソッドが呼び出さDoSomething
れた場合、予期されるデフォルトのURLExampleController/DoSomething
、デフォルトルートが変更されたため、は機能しなくなります。
これの回避策は、デフォルトのルートをいじらないで、RouteConfig.csファイルに新しいルートを作成して、他のアクションやそのようなコントローラーのために、
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name: "Example",
url: "hey/now",
defaults: new { controller = "Example", action = "DoSomething", id = UrlParameter.Optional }
);
これDoSomething
で、ExampleController
クラスのアクションがurlにマップされhey/now
ます。しかし、これは、さまざまなアクションのルートを定義するたびに行うのが面倒になる可能性があります。MVC 5では、URLをそのようなアクションに一致させる属性を追加できるようになりました。
public class HomeController : Controller
{
// url is now 'index/' instead of 'home/index'
[Route("index")]
public ActionResult Index()
{
return View();
}
// url is now 'create/new' instead of 'home/create'
[Route("create/new")]
public ActionResult Create()
{
return View();
}
}