ASP.NET MVC ルーティング概要 (C#)
作成者: Stephen Walther
このチュートリアルでは、ASP.NET MVC フレームワークがブラウザー要求をコントローラー アクションにマップする方法について説明します。
このチュートリアルでは、ASP.NET ルーティングと呼ばれる、すべての ASP.NET MVC アプリケーションで重要となる機能について説明します。 ASP.NET ルーティング モジュールは、受信要求を特定の MVC コントローラー アクションにマップする役割を担います。 このチュートリアルを完了すると、標準ルート テーブルが要求をコントローラー アクションにマップする方法を理解できます。
既定のルート テーブルの使用
新しい ASP.NET MVC アプリケーションを作成すると、ASP.NET ルーティングを使用するようにアプリケーションが構成済みとなっています。 ASP.NET ルーティングは 2 つの場所で設定されます。
まず、ASP.NET ルーティングは、アプリケーションの Web 構成ファイル (Web.config ファイル) で有効になります。 ルーティングに関連する構成ファイルには、system.web.httpModules セクション、system.web.httpHandlers セクション、system.webserver.modules セクション、system.webserver.handlers セクションの 4 つのセクションがあります。 これらのセクションを削除しないように注意してください。これらのセクションがない場合、ルーティングは機能しなくなります。
次に、さらに重要なのは、ルート テーブルはアプリケーションの Global.asax ファイルに作成されることです。 Global.asax ファイルは、ASP.NET アプリケーション のライフサイクル イベント用イベント ハンドラーを含む特殊なファイルです。 ルート テーブルは、アプリケーションの開始イベント中に作成されます。
リスト 1 のファイルには、ASP.NET MVC アプリケーションの既定の Global.asax ファイルが含まれています。
リスト 1 - Global.asax.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace MvcApplication1
{
// Note: For instructions on enabling IIS6 or IIS7 classic mode,
// visit https://go.microsoft.com/?LinkId=9394801
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
}
MVC アプリケーションが最初に起動すると、Application_Start() メソッドが呼び出されます。 このメソッドは、RegisterRoutes() メソッドを呼び出します。 RegisterRoutes() メソッドはルート テーブルを作成します。
既定のルート テーブルには、Default という名前の単一のルートが含まれています。 既定のルートは、URL の最初のセグメントをコントローラー名に、2 番目のセグメントをコントローラー アクションにマップし、3 番目のセグメントを id という名前のパラメーターにマップします。
Web ブラウザーのアドレス バーに次の URL を入力するとします。
/Home/Index/3
既定のルートは、この URL を次のパラメーターにマップします。
controller = Home
action = Index
id = 3
URL /Home/Index/3 を要求すると、次のコードが実行されます。
HomeController.Index(3)
既定のルートには、3 つのパラメーターすべてに対する既定値が含まれています。 コントローラーを指定しない場合、コントローラー パラメーターは既定で Home になります。 アクションを指定しない場合、アクション パラメーターは既定で Index になります。 最後に、ID を指定しない場合、id パラメーターは既定で空の文字列になります。
既定のルートが URL をコントローラー アクションにマップする仕組みの例をいくつか見てみましょう。 ブラウザーのアドレス バーに次の URL を入力するとします。
/Home
この URL を入力すると、Default ルート パラメーターの既定値により、リスト 2 の HomeController クラスの Index() メソッドが呼び出されます。
リスト 2 - HomeController.cs
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index(string id)
{
return View();
}
}
}
リスト 2 では、HomeController クラスに、Id という名前の単一パラメーターを受け取る Index() という名前のメソッドが含まれています。URL /Home により、Index() メソッドは、Id パラメーターの値には空の文字列が指定された状態で呼び出されます。
MVC フレームワークがコントローラー アクションを呼び出す仕組みにより、URL /Home はリスト 3 の HomeController クラスの Index() メソッドも照合します。
リスト 3 - HomeController.cs (パラメーターを持たない Index アクション)
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
}
}
リスト 3 の Index() メソッドは、パラメーターを受け取りません。 URL /Home により、この Index() メソッドが呼び出されます。 URL /Home/Index/3 もこのメソッドを呼び出します (Id は無視されます)。
URL /Home は、リスト 4 の HomeController クラスの Index() メソッドも照合します。
リスト 4 - HomeController.cs (null 許容パラメーターを持つインデックス アクション)
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index(int? id)
{
return View();
}
}
}
リスト 4 では、Index() メソッドには 1 つの Integer パラメーターがあります。 このパラメーターは null 許容パラメーター (値 Null を持つことができます) であるため、Index() を呼び出しても、エラーは発生しません。
最後に、URL /Home でリスト 5 の Index() メソッドを呼び出すと、ID パラメーターが null 許容パラメーター ではないため、例外が発生します。 Index() メソッドを呼び出そうとすると、図 1 に示したようなエラーが表示されます。
リスト 5 - HomeController.cs (Id パラメーターを持つインデックス アクション)
using System.Web.Mvc;
namespace MvcApplication1.Controllers
{
[HandleError]
public class HomeController : Controller
{
public ActionResult Index(int id)
{
return View();
}
}
}
図 01: パラメーター値が期待されるコントローラー アクションの呼び出し (ここをクリックすると、フルサイズの画像を表示できます)
一方、URL /Home/Index/3 は、リスト 5 のインデックス コントローラー アクションで問題なく動作します。 要求 /Home/Index/3 により、値 3 を持つ Id パラメーターを使用して Index() メソッドが呼び出されます。
まとめ
このチュートリアルの目的は、ASP.NET ルーティングの簡単な概要を説明することです。 新しい ASP.NET MVC アプリケーションで取得する既定のルート テーブルを調べました。 既定のルートが URL をコントローラー アクションにマップする仕組みについて学習しました。