asp.net Mvc 路由詳解,非常詳細.

 

 

關於路由的理解

爲什麼要定義路由?路由的定義在開發中的工作量非常小,但是非常重要,因爲任何請求都離不開路由。

各個電商網站的 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就派上用場了.

將兩邊的路由都加上 各自的命名空間

 

到此,路由的講解 也就玩了.

 

**加粗樣式**
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章