自定義路由

自定義路由提供了特定的路由選擇來處理特定的傳入請求。

要定義自定義路由,請記住,新增到路由表的路由順序很重要。

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
    // this is an advanced custom route
    // you can define custom URL with custom parameter(s) point to certain action method
    routes.MapRoute(
    "CustomEntry", // Route name
    "Custom/{entryId}", // Route pattern
    new { controller = "Custom", action = "Entry" } // Default values for defined parameters above
    );

    // this is a basic custom route
    // any custom routes take place on top before default route
    routes.MapRoute(
    "CustomRoute", // Route name
    "Custom/{controller}/{action}/{id}", // Route pattern
    new { controller = "Custom", action = "Index", id = UrlParameter.Optional } // Default values for defined parameters above
    );

    routes.MapRoute(
    "Default", // Route name
    "{controller}/{action}/{id}", // Route pattern
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Default values for defined parameters above
    );
}

controlleraction 名稱保留。預設情況下,MVC 將 URL 的 {controller} 部分對映到類 <controller>Controller,然後查詢名為 <action> 的方法,而不新增任何字尾。

儘管使用 {controller}/{action}/{parameter} 模板建立一系列路徑可能很誘人,但考慮到這樣做會洩露應用程式的結構並使 URL 變得有些脆弱,因為更改控制器的名稱會更改路徑並中斷使用者儲存的連結。

首選顯式路線設定:

routes.MapRoute(
    "CustomRoute", // Route name
    "Custom/Index/{id}", // Route pattern
    new { controller = "Custom", action = nameof(CustomController.Index), id = UrlParameter.Optional }
);

(你不能將 nameof 運算子用於控制器名稱,因為它將具有附加字尾 Controller),在路由中設定控制器名稱時必須省略。