ASP.NET MVC 路由概觀 (C#)

作者 :Stephen Walther

在本教學課程中,Stephen Walther 示範 ASP.NET MVC 架構如何將瀏覽器要求對應至控制器動作。

在本教學課程中,您將介紹每個 ASP.NET MVC 應用程式的重要功能,稱為 ASP.NET 路由。 ASP.NET 路由模組負責將傳入要求對應至特定的 MVC 控制器動作。 在本教學課程結束時,您將瞭解標準路由表如何將要求對應至控制器動作。

使用預設路由表

當您建立新的 ASP.NET MVC 應用程式時,應用程式已設定為使用 ASP.NET 路由。 ASP.NET 路由設定于兩個位置。

首先,ASP.NET 路由會在應用程式的 Web 組態檔 (Web.config 檔案) 中啟用。 組態檔中有四個區段與路由相關:system.web.HTTPModules 區段、system.web.HTTPHandlers 區段、system.webserver.modules 區段,以及 system.webserver.handlers 區段。 請小心不要刪除這些區段,因為沒有這些區段路由將無法再運作。

其次,更重要的是,路由表會在應用程式的 Global.asax 檔案中建立。 Global.asax 檔案是特殊檔案,其中包含 ASP.NET 應用程式生命週期事件的事件處理常式。 路由表會在 Application Start 事件期間建立。

清單 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 的第一個區段對應至控制器名稱、URL 的第二個區段對應至控制器動作,並將第三個區段對應至名為 id的參數。

假設您在網頁瀏覽器的網址列中輸入下列 URL:

/Home/Index/3

預設路由會將此 URL 對應至下列參數:

  • controller = Home

  • action = Index

  • id = 3

當您要求 URL /Home/Index/3 時,會執行下列程式碼:

HomeController.Index (3)

預設路由包含所有三個參數的預設值。 如果您沒有提供控制器,控制器參數會預設為 Home值。 如果您沒有提供動作,動作參數會預設為 Index值。 最後,如果您未提供識別碼,id 參數會預設為空字串。

讓我們看看預設路由如何將 URL 對應至控制器動作的一些範例。 假設您在瀏覽器網址列中輸入下列 URL:

/家

由於預設路由參數預設值,輸入此 URL 會導致在清單 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 類別包含名為 Index () 的方法,可接受名為 Id 的單一參數。URL /Home 會導致使用空字串呼叫 Index () 方法做為 Id 參數的值。

由於 MVC 架構叫用控制器動作的方式,URL /Home 也會符合清單 3 中 HomeController 類別的 Index () 方法。

清單 3 - HomeController.cs (索引動作,沒有參數)

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 也會在) 忽略識別碼 (叫用此方法。

URL /Home 也會符合清單 4 中 HomeController 類別的 Index () 方法。

清單 4 - HomeController.cs (Index 巨集指令與可為 Null 的參數)

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index(int? id)
        {
            return View();
        }
    }
}

在清單 4 中,Index () 方法有一個 Integer 參數。 因為參數是可為 Null 的參數, (可以有 Null) 值,所以可以呼叫 Index () ,而不會引發錯誤。

最後,叫用清單 5 中 URL /Home 的 Index () 方法會造成例外狀況,因為 Id 參數 不是 可為 Null 的參數。 如果您嘗試叫用 Index () 方法,則會收到圖 1 中顯示的錯誤。

清單 5 - HomeController.cs (識別碼參數) 索引動作

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 會導致 Index () 方法使用值為 3 的 Id 參數呼叫。

摘要

本教學課程的目標是提供您 ASP.NET 路由的簡短簡介。 我們已檢查您使用新 ASP.NET MVC 應用程式取得的預設路由表。 您已瞭解預設路由如何將 URL 對應至控制器動作。