MVC5での属性ルーティング
routes.MapRoute(...)
MVC 5より前では、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();
}
}