標籤:
MVC的預設路由可以在Global.asax.cs檔案的RegisterRoutes方法中設定,其結構非常的簡單易用,可以匹配各種形式,
路由配置可以由三個部分組成,最常見的就是{controller}/{action}/{id},只要這三個部分不連續出現,有間隔符,那麼都可以匹配,
比如可以是{controller}-{action}-{id},
也可以是{controller}·{action}·{id},
喜歡的話還可以添加各種奇怪的東西,比如 lalal/{controller}·{action}·{id},可以匹配lalal/controller·action·100醬紫
不過要注意的問題是,路由匹配是根據加入順序依次進行的,
產品詳情的連結是:http://localhost/ProductOffline/product/ProductDetail/142,
產品目錄的連結是:http://localhost/ProductOffline/ProductCategory/ProductCategoryDetail/25
如果設定的路由是如下,先聲明產品詳情路由,再聲明ProductCategory路由
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
//產品詳情路由 routes.MapRoute( "Default", // Route name "{controller}/{action}/{ID}",// URL with parameters new { controller = "product", action = "productlist",productid=UrlParameter.Optional} // Parameter defaults ); //產品目錄路由 routes.MapRoute( "ProductCategory", // Route name "ProductCategory/ProductCategoryDetail/{ProductCategoryID}",// URL with parameters new { controller = "ProductCategory", action = "ProductCategoryDetail"} // Parameter defaults ); }
那麼在跳轉 http://localhost/ProductOffline/ProductCategory/ProductCategoryDetail/25 時會報錯,
因為已經匹配到了第一個路由,而第一個路由中,是沒有ProductCategoryController及ProductCategoryDetailAction
所以,需要像下面這樣寫,就可以匹配到正確的路由了:)
public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "ProductCategory", // Route name "ProductCategory/ProductCategoryDetail/{ProductCategoryID}",// URL with parameters new { controller = "ProductCategory", action = "ProductCategoryDetail"} // Parameter defaults ); routes.MapRoute( "Default", // Route name "{controller}/{action}/{ProductID}",// URL with parameters new { controller = "product", action = "productlist",productid=UrlParameter.Optional} // Parameter defaults ); }
MVC的路由機制