控制器與路由

ASP.NET Core Web 應用開發–使用 MVC 框架 / PART II MVC 的細節 / 控制器與路由

當使用者在MVC網頁上操作,無論是按下超連結,或是一個表單的傳送按鈕,一個URL路徑要求資訊會被送出,傳送至特定的控制器檔案,並且執行對應的動作方法,最後回傳結果,在這個過程中,MVC依賴路由中介軟體進行URL路徑的解析與進一步處理,因此必須需預先定義路由樣式以支援相關的解析作業。

MVC專案內建必要的預設路由樣式,開發人員一開始並不需要特別處理路由樣式的設定。現在建立一個專案RoutingDemo,開啟其中的Startup.cs。

找到Startup.Configure(),其中包含路由樣式的設定,載圖中框線的內容:

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
});

其中endpoints.MapControllerRoute定義了路由規則, name表示此路由樣式識別名稱,default表示此為其預設值,第二個具名參數pattern定義URL路徑的解析樣式,並以斜線「/」分段,第一段 {controller=Home} 對應控制器名稱,第二段 {action=Index} 對應動作方法名稱。

考慮以下的URL:

http://kangting.tw/app/HelloMessage

與樣式比對,網站名稱kangting.tw之後的 app 是第一個區段,對應至樣式中的第一個區段 {controller=Home},表示控制器的名稱 app,而 HelloMessage 則對應至第二段 {action=Index},表示動作方法名稱,樣式比對如下圖:

透過解析 MVC 接收到這個URL路徑字串,將尋找專案中的 app控制器,然後執行其中的HelloMessage方法。

路由樣式的預設值

路由樣式有三個區段,如果區段比對沒有對應的值,則會嘗試以預設值替代。

從最後一個區段開始來看,{id?} 中的「?」表示這個值如果沒有的話可以直接忽略。

第二個區段的 {action=Index} 在找不到對應的動作方法名稱,以Index為動作方法名稱。

第一個區段 {controller=Home} 則是以 Home 為控制器的預設名稱。

以下列舉數種典型的解析結果:

URL路徑解析結果
http://kangting.twhttp://kangting.tw/Home/Index
http://kangting.tw/app/ http://kangting.tw/app/Index
http://kangting.tw/app/HelloMessage http://kangting.tw/app/HelloMessage
http://kangting.tw/app/HelloMessage/123 http://kangting.tw/app/HelloMessage/123
http://kangting.tw/app/HelloMessage/123/abc 超過三個區段,比對失敗

開啟RoutingDemo專案,現在瀏覽其中的預設控制器,畫面如下:

觀察其中的網址列是Home/Index,如果移除Index區段,會得到相同的結果如下:

這一次因為找不到最後一個區段,因此直接以預設值Index為區段名稱,得到與上述相同的結果。如果將全部區段移除,得到以下的結果:

以Home/Index為預設值,最後還是載入相同的網頁內容。

於 Controllers 資料夾新增另外一個控制器檔案 AppController.cs,其中配置另外一組動作方法 HelloMessage(),結果如下:

namespace RoutingDemo.Controllers
{
    public class AppController : Controller
    {
        public IActionResult Index()
        {
            return View();
        }
        public IActionResult HelloMessage()
        {
            return View();
        }
    }
}

接下來分別為 Index() 與HelloMessage () 建立對應的檢視檔案,並且於其中分別配置 <h1>,以識別執行的檢視檔案。

現在瀏覽檢視檔案如下:

無論 App/Index 或是 App/ 結果均是執行 Index.cshtml 檢視之後轉換的網頁結果,而明確的指定 App/ HelloMessage ,才會執行 HelloMessage.cshtml,如下圖:

沒有留言: