次の方法で共有


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();
        }
    }
}

Invoking a controller action that expects a parameter value

図 01: パラメーター値が期待されるコントローラー アクションの呼び出し (ここをクリックすると、フルサイズの画像を表示できます)

一方、URL /Home/Index/3 は、リスト 5 のインデックス コントローラー アクションで問題なく動作します。 要求 /Home/Index/3 により、値 3 を持つ Id パラメーターを使用して Index() メソッドが呼び出されます。

まとめ

このチュートリアルの目的は、ASP.NET ルーティングの簡単な概要を説明することです。 新しい ASP.NET MVC アプリケーションで取得する既定のルート テーブルを調べました。 既定のルートが URL をコントローラー アクションにマップする仕組みについて学習しました。