ASP.NET MVC 路由概觀 (C#)
在此教學課程中,Stephen Walther 示範 ASP.NET MVC 架構如何將瀏覽器要求對應至控制器動作。
在此教學課程中,您會了解每個稱為 ASP.NET 路由 的每個 ASP.NET MVC 應用程式的重要功能。 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 應用程式生命週期事件的事件處理常式。 路由表會在應用程式啟動事件期間建立。
清單 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)。 Default 路由會將 URL 的第一個區段對應至控制器名稱、URL 的第二個區段對應至控制器動作,並將第三個區段對應至名為 id 的參數。
假設您在網頁瀏覽器的網址列中輸入下列 URL:
/Home/Index/3
Default 路由會將此 URL 對應至下列參數:
controller = Home
action = Index
id = 3
當您要求 URL /Home/Index/3 時,會執行下列程式碼:
HomeController.Index(3)
Default 路由包含所有三個參數的預設值。 如果您沒有提供控制器,控制器參數會預設為 Home 值。 如果您沒有提供動作,動作參數會預設為 Index 值。 最後,如果您沒有提供識別碼,id 參數會預設為空字串。
讓我們看看一些範例,說明 Default 路由如何將 URL 對應至控制器動作。 假設您在瀏覽器的網址列中輸入下列 URL:
/Home
由於 Default 路由參數預設值,輸入此 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 會使用空字串做為 Id 參數的值來呼叫 Index() 方法。
由於 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 也會叫用此方法 (忽略 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() 方法有一個 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 對應至控制器動作。