RealPath:
WebPath:
2016/12/24 22:13 (JST) 更新
Tips >>

ルート設定等

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 が入ることになります。