關於路由的理解
為什么要定義路由?路由的定義在開發中的工作量非常小,但是非常重要,因為任何請求都離不開路由。
各個電商網站的 URL 使用非常靈活,都離不開路由的定義,請大家參考幾家電商的 URL 如下:
使用路由的好處:
能夠根據系統需求,靈活的划分請求規則(不同模塊請求的 URL 是不一樣的)。
屏蔽物理路徑,提高系統的安全性,以上情況是無法根據 URL 分析視圖文件在站點目錄中的位置。
有利於搜索引擎優化,可以將 URL 請求統一規范,以后維護中,如果頁面發生變化,URL 可以保持不變。
ASP.NET MVC 中的路由
回顧 MVC 的工作過程,加入用戶請求如下 URL,則路由的執行過程如圖所示:
ASP.NET MVC 默認路由
RouteConfig.cs 中的 URL 規則定義如下:
URL 模式解釋:
上面的 URL 中的參數值是:“{controller}/{action}/{id}”,稱之為 URL 模式。
該模式是一種字符串,包括一些固定的“字符字面量”和“占位符”,占位符用大括號“{}”表示。
URL 模式規定了 URL 路徑的定義規則。
URL 模式的定義
定義語法:
占位符:可以是一個字符串或字符,比如“x”、“id”、“year”等。
字面量:可能是一個比較固定的字符,比較常見的是斜杠“/”;也可以是字符串。示例如下:
特殊規則:不能以斜杠“/”或波浪線“~”字符開頭,不能包含“?”,同時占位符也不能連續。示例如下:
URL 模式匹配示例總結:
匹配要求:
1 字面量:必須嚴格匹配,即實際請求的 URL 中的字符串和路由模式中的字面量字符串必須完全一致。
2 大小寫:URL 模式匹配是不區分大小寫。
3 常量:沒有包含在大括號內的信息被作為一個常量對待;比如上面的 Course,以及在分區項目中路由的定義
Admin/{controller}/{action}/{id} 這是分期路由的定義
URL 模式匹配原理分析
URL 模式匹配原理圖解:
定義多個路由
routes.MapRoute()定義路由的要求如下:
string[] namespaces 這個命名空間 在分區的時候用到
可以通過不同的路由名稱定義多組路由。
定義多個路由的方法,參考如下代碼:
路由的匹配原則:如果一個 URL 能夠在多個路由中匹配,則默認使用第一個匹配的路由。
UrlPrameter.Optional 的參數作用是什么?該參數可以作為路由參數的默認值,當需要讓“/Home/Index” 或“/Home”能正常匹配,但又不希望賦一個無意義的值,可以使用該參數。
路由匹配總結:
關於{controller}/{action}
必不可少:在一個實際的 MVC 系統中, {controller}和{action} 必不可少,如果缺少就會找不到路徑而出錯。
約定規則:這個占位符是 MVC 里面約定的,並且會被解析成控制器和對應的方法。
位置靈活:這兩個約定的占位符可以在任意位置。
其他占位符
僅僅占位:其他占位符只起到占位而已,比如{aa}/{bb}/{cc}是不能把 aa 解析成控制器,bb 解析成動作方法。默認要求:一個路由中,如果沒有規定{controller}和{action},或者只是規定其中之一,則沒有規定的部分都將使用默認值。
如果你在路由里面沒有寫Controller 和 action 那么你在默認值里 一定要配
匹配順序
優先使用:多個路由匹配一個 URL,則優先匹配的會使用。
盡量避免:定義多個路由時,盡量避免出現多匹配。
路由數據、特殊匹配、默認值與約束
路由數據的存儲和映射
數據存儲方法:在 ASP.NET MVC 路由系統中,RouteData 對象用來保存 URL 模式和實際 URL 匹配產生的路由數據。
數據存儲格式:路由數據保存方式為:“鍵-值”對,RouteData 是視圖基類和控制器基類的屬性。
路由和控制器的映射:{controller} 和{action} 在程序運行中的映射如圖所示:
\
使用路由數據
RouteData.Values 介紹:
1 是 RouteValueDictionary 類型,使用方式和 Dictionary<TKey, TValue>類似。
2 RouteData 定義為視圖和控制器基類的屬性。
3 在視圖中可以遍歷 RouteDate.Values,來輸出路由匹配產生的路由數據。
路由數據的獲取方法測試如下:
特殊 URL 匹配規則
*匹配:用*來匹配 URL 剩余部分,示例代碼如下:
貪婪匹配規則,示例代碼如下:
路由默認值
再次強調 defaults 參數的作用,如下示例所示:
默認值不提供的必須通過 URL 提供,示例如下:
只提供中間參數的默認值不起作用,如下圖:
包含“字面量”時默認值不起作用,如下圖:
路由約束
(1)路由約束的引出:某 Blog 系統,定義 URL 模式 ,可根據 URL 中的“年月日”數據讀取文章?
(2)分析:定義 URL 模式為{year}/{month}/{day},如何避免無意義的 URL?
解決方案:使用正則表達式,示例如下:
通過路由生成 URL
視圖中的鏈接
(1)鏈接的兩種方式:純靜態鏈接:直接指向鏈接地址,一般不需要改變。動態鏈接:為了更好的保證 web 項目移植的時候路徑的正確。
(2)Url.Content()方法的不足:當路由規則變化是,需要修改所有路徑。示例如下:
使用 Action()生成鏈接
(1)Url.Action()方法定義如下:
(1)示例:URL 模式為 stumanage/{controller}/{action}/{id}
使用 ActionLink()生成鏈接
(1)Html.ActionLink()方法定義如下:
(2)示例:URL 模式為 {controller}/{action}/{id}
分區項目
分區項目簡介
(1)分區項目的作用:解決 Controller 和 View 太多的問題,能夠讓系統模塊划分更清晰,便於管理
(2)創建方法:添加-區域 打開添加區域對話框,輸入區域名稱
不同分區項目相同控制器的解決方法
(1)主項目和分區項目有相同的控制器,程序運行會出現錯誤,如下所示:
解決方法:分別給分區項目和主項目的路由添加命名空間。示例如下:
這時候上文說的namespaces就派上用場了.
將兩邊的路由都加上 各自的命名空間
到此,路由的講解 也就玩了.