MVC雜記 路由

2021-09-09 00:03:02 字數 4179 閱讀 1425

在學習mvc的過程中,記錄一些基礎但很必要的東西。

學習mvc很多同學都喜歡使用預設的路由配置,而不關心怎麼去利用它實現一些複雜的或者自定義的配置,下面結合msdn一起學習一下

1.mvc路由有什麼用處?

2.路由定義的**和非路由定義的**有什麼區別?

答:在不使用路由的 asp.net 應用程式中,對 url 的傳入請求通常對映到處理該請求的物理檔案,如 .aspx 檔案。

網頁使用查詢字串值 id=4 來確定要顯示的內容型別。

在 asp.net 路由中,可以定義 url 模式,這些模式對映到請求處理程式檔案但是不必在 url 中包含這些檔案的名稱。

另外,可以在 url 模式中包含佔位符,以便無需查詢字串,即可將變數資料傳遞到請求處理程式。

在不由 url 路由管理的請求中,/products/show/beverages 片斷將被解釋為應用程式中乙個檔案的路徑。

好了暫時先簡單的說以上兩個問題,或許有的同學還是很迷糊,那麼我們再進一步的理一下.

我們可以把類似這樣的過程簡單的看成是請求和響應的過程,那麼asp.net路由在這個中間環節怎麼處理的哪?

當收到請求時,會將由路由找到適當的urlroutingmodule 物件來處理,然後傳送到handler http 處理程式。如果handler http是由mvchandler http 處理的,那麼就進入了mvc的執行生命週期,程式通過向 url 中的控制器值新增字尾「controller」以確定將處理請求的控制器的型別名稱,來確定要呼叫的控制器。 url 中的操作值確定要呼叫的操作方法。

例如,包含 url 路徑 /products 的 url 對映到名為 productscontroller 的控制器。 action 引數中的值是呼叫的操作方法的名稱。 包含 url 路徑 /products/show 的 url 將導致呼叫 productscontroller 類的 show 方法。

我們找到global.ascx檔案開啟,找到其中的定義的預設路由來初步認識一下它的定義:

1

public

class27

8public

static

void

registerroutes(routecollection routes)

9.axd/");

1112

routes.maproute(13"

default

", //

路由名稱14"

//", //

帶有引數的 url

15new //

引數預設值

16);

1718}19

20protected

void

2130 }

registerroutes(routetable.routes);  那麼又帶我轉向了registerroutes這個函式的定義處:

routes.ignoreroute("

.axd/

");//

代表乙個名為resource的routevalue表示式,只是乙個變數名的佔位符,是用來

放置用不到的變數。用於匹配所有完整的路由資訊中除去.axd部分剩餘的部分,當然是這個*的作用,如果沒有,則不能匹配完全,來舉個例子

asd.axd/a/c/v  ,如果是那麼就會全部匹配

asd.axd/a/c/v ,如果是則只會匹配到asd.axd/a。之所以在途中標註是佔位符,這些佔位符的名字其實起什麼都可以。

new  //

引數預設值

定義路由時可以為引數分配乙個預設值。

如果 url 沒有包括該引數的值,則會使用預設值。

通過將字典物件分配給 route 類的defaults屬性,可以設定路由的預設值

於 mvc 應用程式,通過 routecollectionextensions.maproute 方法的過載(例如 maproute(routecollection, string, string, object, object))可以指定預設值。

在 url 模式中處理可變數量的段

有時您需要處理包含可變數量的 url 段的 url 請求。

定義路由時,可以指定 url 是否具有比模式中更多的段,是否將額外的段視為最後乙個段的一部分。

若要以此方式處理額外的段,可以用星號 (*) 標記最後乙個引數。

該引數稱為「可用於放置各種資訊的」引數。

具有全部捕捉引數的路由也將與那些不包含最後乙個引數的任意值的 url 相匹配。

下面的示例演示乙個與未知數量的段匹配的路由模式。

query//

asp.net 路由處理 url 請求時,在示例中演示的路由定義得到下表列出的結果。

除了按照 url 中的引數數量將 url 請求匹配到路由定義中,還可以指定引數中的值滿足特定約束。

如果乙個 url 包含路由的約束以外的值,則該路由不用於處理請求。

新增約束以確保 url 引數包含將在應用程式中起作用的值。

約束是通過使用正規表示式或使用實現 irouteconstraint 介面的物件來定義的

將路由定義新增到 routes 集合時,同時也通過建立乙個包含驗證測試的 routevaluedictionary 物件新增了約束。

字典中的關鍵字標識約束適用的引數。

字典中的值可以是表示正規表示式的字串,也可以是實現 irouteconstraint 介面的物件。

提供字串後,路由將視字串為正規表示式,並通過呼叫 regex 類的 ismatch 方法檢查引數值是否有效。

總是將正規表示式視為不區分大小寫。

提供 irouteconstraint 物件後,asp.net 路由將通過呼叫 irouteconstraint 物件的 match 方法檢查引數值是否有效。

match 方法返回乙個布林值,該值指示引數值是否有效。

(在 mvc 應用程式中,使用 maproute 方法。)

public

static

void registerroutes(routecollection routes)

/", "~/categoriespage.aspx",

true,

new routevaluedictionary

, },

new routevaluedictionary

-[a-z]"},"}}

);}

路由處理 url 請求時,在上一示例中演示的路由定義生成下表列出的結果。

預設情況下,路由不處理對映到 web 伺服器上現有物理檔案的請求。

即使匹配乙個定義的模式(例如 //),路由也不處理該請求。

如果希望路由處理所有請求(包括指向檔案的請求),可以通過將 routecollection 物件的routeexistingfiles屬性設定為 true 來重寫預設行為。

將該值設定為 true 後,與定義的模式匹配的所有請求都將由路由處理。

還可以指定路由不應處理某些 url 請求。

通過定義路由並指定應使用 stoproutinghandler

類來處理該模式,來阻止路由處理某些特定請求。

當 stoproutinghandler 物件處理請求時,stoproutinghandler 物件會阻止以任何其他方式將該請求處理為路由。而是會將該請求處理為 asp.net 頁、web 服務或其他 asp.net 終結點

可以使用 routecollection.ignore 方法(對於 mvc 應用程式,為 routecollectionextensions.ignoreroute)建立使用 stoproutinghandler 類的路由。

下面的示例演示如何阻止路由處理 webresource.axd 檔案的請求。

public

static

void registerroutes(routecollection routes)

.axd/");

}

MVC路由規則

路由解析過程 這是routing元件的兩個重要的作用!例項一 系統預設提供的路由格式,下面是系統給的預設 public static void registerroutes routecollection routes 2 axd 4 5 routes.maproute 6 default 路由名稱...

MVC 路由 概述

設定url路由 url路徑中,大括號 內部的代表引數。作為分割符,不再大括號內的則作為常量。值得注意的是,和作為2個關鍵字由mvc路由控制,如果確實需要用這個名字命名引數,可以在前面加上 例如。預設的設定路由在global.asax檔案中 public static void registerrou...

MVC 路由 概述

設定url路由 url路徑中,大括號 內部的代表引數。作為分割符,不再大括號內的則作為常量。值得注意的是,和作為2個關鍵字由mvc路由控制,如果確實需要用這個名字命名引數,可以在前面加上 例如。預設的設定路由在global.asax檔案中 public static void registerrou...