一. 什麼是路由? 一種URL(統一資源定位符)的體現方式,將URL映射到方法的調用。 轉變觀念:(URL未必是指Web伺服器上的靜態資源文件)。 二. 為什麼使用路由? 如同規範的代碼縮進一樣,這是對代碼質量的提高,是對URL的重視; 消除必須使用物理文件映射 URL 的弊端; 防止註入式攻擊,提 ...
一. 什麼是路由?
一種URL(統一資源定位符)的體現方式,將URL映射到方法的調用。
轉變觀念:(URL未必是指Web伺服器上的靜態資源文件)。
二. 為什麼使用路由?
- 如同規範的代碼縮進一樣,這是對代碼質量的提高,是對URL的重視;
- 消除必須使用物理文件映射 URL 的弊端;
- 防止註入式攻擊,提高安全性。傳統的URL和磁碟上的內容有著直接對應的關係,通過URL就可以確定該站點的目錄結構,路由是把請求映射到控制器的操作,較為安全;
- 可以約束URL的各個部分。
三. 如何定義路由?
創建一個ASP.NET MVC項目,打開應用程式文件(Global.asax.cs),可以看到在Application_Start方法中調用了RouteConfig.RegisterRoutes方法,該方法就是集中控制路由的地方。
F12轉到方法定義,它在/App_Start/RouteConfig.cs文件中。
一.特性路由
調用MapMvcAttributeRoutes()方法啟用特性路由:
特性路由,顧名思義,通過特性來定義路由。
在Controllers中添加一個空的Home控制器。
1.為方法添加一個Route特性
(URL為/Index的請求時,就會運行Index方法)
(通過 / 、/Index 都能訪問)
2.路由值(動態路由)
通過花括弧創建了一個占位符,如:/Index/xiaoming 就會匹配到這個路由。
問題:以下情況下' /Index '會匹配那個路由呢?
結論:靜>動
3.控制器路由
如果一個方法寫一個路由( [Route(ControlName/ActionName)] )的話,就會有重覆的代碼,這時候就可以在控制器(類)上添加路由特性。
使用特殊路由參數action
(可以通過 /Home/Index 、/Home/About 分別訪問Index和About方法)
通過=號賦值的方式為路由參數提供預設值
(請求為 /Home 時預設請求 Index)
通過?號為路由定義可選參數
這時候如果通過/Home/1 請求的話會提示404,因為如果URL為兩段的話它會把 ‘1’匹配到 action 。
4.路由約束
這個時候你請求' /About/2 ' 的時候就會提示請求不明確
通過約束解決
(只用當參數為int值時才會匹配第一個About)
像這樣放到路由模板中的約束叫內聯約束,還有很多:
二 . 傳統路由
回到RegisterRoutes方法,清空代碼,添加一個傳統路由
controller和action是特殊參數,它們映射到控制器和方法,在傳統路由中是必須參數,沒有的話會報500的錯誤,提示不包括所需的“controller”路由值。
傳統路由有更靈活的路由語法規則
{controller}/{action}/{id} {controller}-{action}-{id} {controller}-{action}.{id}
...
上面這些都是有效的路由。
MapRoute的第三個參數由於設置預設值
public static void RegisterRoutes(RouteCollection routes) { //映射指定的URL路由 routes.MapRoute("simple", "{controller}/{action}/{id}",new { id= UrlParameter.Optional, //設置id參數為可選參數 action= "Index" //設置action參數的預設值為Index }); }
MapRoute的第四個參數由於設置路由值的約束