日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

ASP.NET MVC3 学习心得------路由机制

發(fā)布時(shí)間:2025/3/15 asp.net 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET MVC3 学习心得------路由机制 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

9.1?理解URL

URL滿足的要求:

l?域名易于記憶和拼寫(xiě)

l?簡(jiǎn)短、易輸入

l?可以反應(yīng)出站點(diǎn)的結(jié)構(gòu)

l?可破解,用戶可以通過(guò)移除URL的末尾,進(jìn)而達(dá)到更高層次的信息體系結(jié)構(gòu)

l?持久、不能變化

9.2路由機(jī)制的概述

ASP.NET?MVC中路由機(jī)制的兩種用途:

l?匹配傳入的請(qǐng)求,并映射到控制器的操作

l?構(gòu)造傳出的URL,用來(lái)相應(yīng)控制器的操作

9.2.1?對(duì)比路由和URL重寫(xiě)

URL重寫(xiě)是將URL映射到另一個(gè)URL

路由是將URL映射到資源

兩者的區(qū)別:路由機(jī)制也使用它在匹配傳入U(xiǎn)RL時(shí)同樣的映射規(guī)則來(lái)幫助生成URL,而URL重寫(xiě)只能用于傳入的請(qǐng)求URL,而不能幫助生成原始的URL

9.2.2?路由的定義

路由的定義是從URL模式開(kāi)始的,因?yàn)樗付伺c路由相匹配的模式,路由可以指定它的URL及其默認(rèn)值,還可以約束URL的各個(gè)部分,提供關(guān)于路由如何、何時(shí)、傳入的請(qǐng)求URL相匹配的嚴(yán)格控制

路由URL

我們?cè)谛陆ǖ膽?yīng)用程序中的Global.asax.cs文件的Application_Start方法中調(diào)用了一個(gè)RegisterRoutes方法,如下:

?public?static?void?RegisterRoutes(RouteCollection?routes)

????????{

????????????routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

?

????????????routes.MapRoute(

????????????????"Default",?//?路由名稱

????????????????"{controller}/{action}/{id}",?//?帶有參數(shù)的?URL

????????????????new

????????????????{

????????????????????controller?=?"Home",

????????????????????action?=?"Index",

????????????????????id?=?UrlParameter.Optional

????????????????}?//?參數(shù)默認(rèn)值

????????????);

????????}

如:routes.MapRoute("Default","{first}/{second}/{third}");

在兩個(gè)斜杠之前的花括號(hào)為占位符,這些占位符即是URL參數(shù),該示例定義的規(guī)則可以匹配任何帶有3個(gè)段的URL,我們可以將這些參數(shù)命名為任何想要的名稱,當(dāng)客戶端請(qǐng)求到達(dá)服務(wù)器時(shí),路由將解析請(qǐng)求的URL,并將解析出的路由參數(shù)值放入字典中

2、路由值

我們可以使用任何想要的名稱定義路由,但是為了程序的正確的運(yùn)行ASP.NET?MVC?框架要求使用一些特定的參數(shù)名--{controller}和{action}

{controller}為處理請(qǐng)求的控制器,ASP.NET?MVC?規(guī)定將Controller后添加到{Controller}URL參數(shù)值的后面構(gòu)成一個(gè)類(lèi)型名稱,然后根據(jù)名稱查找實(shí)現(xiàn)了System.Web.Mvc.IController接口的類(lèi)型

如下示例:routes.MapRoute{"Default","{controller}/{action}/{id}");

路由URL在段中也允許包含字面值,如將MVC集成到一個(gè)現(xiàn)有的站點(diǎn)中并想要所有的MVC請(qǐng)求一site開(kāi)頭?則如下:site/{controller}/{action}/{id}

所以該路由只能匹配site/Home/index/123?而不是匹配/Home/index/231

此外,URL段中還允許字面值和參數(shù)混在一起,但是它不允許有兩個(gè)連續(xù)的URL參數(shù),

如下:{language}-{country}/{controller}/{action}

??????{controller}.{action}.{id}

有時(shí)只需要匹配兩個(gè)參數(shù),這個(gè)時(shí)候我們不需要在重寫(xiě)路由了,只需要將第三個(gè)參數(shù)換為可選參數(shù)就行

如下:routes.MapRoute("Default","{controller}/{action}/{id}",new?{id=Urlparameter.Optional});

我們也可以為多個(gè)參數(shù)提供默認(rèn)值:

如:routes.MapRoute("Default","{controller}/{action}/{id}",new?{id=Urlparameter.Optional,action=“index"});

路由URL模式、默認(rèn)值及其匹配

路由URL模式???????????????????????默認(rèn)值???????????????????匹配URL模式示例

{controller}/{action}/{id}??new?{id=UrlParameter.Optional}?/albums/diplay/123

????????????????????????????????????????????????????????????/albums/diplay

{controller}/{action}/{id}??new?{id=UrlParameter.Optional,?/albums/display/123

?????????????????????????????????Action="index",???????????/albums/display

?????????????????????????????????Id=UrlParameter.Optional}?/albums

???????????????????????????????????????????????????????????/??????????????????????????????????

4、路由約束

有時(shí)候需要對(duì)指定URL段的數(shù)量來(lái)說(shuō),我們需要對(duì)URL有更多的控制

如下URL:

l?http://example.com/2008/01/16

l?http://example.com/posts/categories/aspnetmvc/

以上的兩個(gè)URL都包含3個(gè)段,且都可以和默認(rèn)路由匹配,但是如第一個(gè)URL要匹配一個(gè)2008controller的控制器,這樣是錯(cuò)誤的,因此需要對(duì)路由進(jìn)行約束,:

如:

?routes.MapRoute("blog",?"{year}/{month}/{day}",?new

????????????{

????????????????controller?=?"blog",

????????????????action?=?"index"

????????????},?new

????????????{

????????????????year?=?@"\d{4}",

????????????????month?=?@"\d{2}",

????????????????day?=?@"\d{2}"

????????????});

????????????routes.MapRoute("simple",?"{controller}/{action}/{id}");

路由機(jī)制自動(dòng)的使用^和$符號(hào)包裝指定的約束表達(dá)式,以確保表達(dá)式能夠精確的匹配參數(shù)值

在本示例中,我們?cè)谀J(rèn)的simple路由之前添加的新路由,路由按先后順序與傳入的URL進(jìn)行匹配,直到匹配成功,因?yàn)?2008/01/16的請(qǐng)求將與兩個(gè)定義的路由都匹配,所以我們把更具體的路由放在了前面

9.2.3?命名路由

為路由指定名稱可以解決URL的路由二義性問(wèn)題

如:

routes.MapRoute(name:?"Test",?url:?"code/p/{action}/{id}",?defaults:?new

????????????{

????????????????controller?=?"Section",

????????????????action?=?"Index",

????????????????id?=?""

????????????});

????????????routes.MapRoute(name:?"Default",?url:?"{controller}/{action}/{id}",?defaults:?new

????????????{

????????????????controller?=?"Home",

????????????????action?=?"Index",

????????????????id?=?""

????????????});

在視圖中生成指向路由的超鏈接如下:

????@Html.RouteLink("Test",?new

{

????controller?=?"section",

????action?=?"Index",

????id?=?123

});

????@Html.RouteLink("Default",?new

{

????controller?=?"Home",

????action?=?"Index",

????id?=?"123"

});

該方法不能指定由哪個(gè)路由來(lái)生成鏈接

為此我們做如下修改:

?@Html.RouteLink(linkText:?"Route:Test",?routeName:?"Test",?new

{

????controller?=?"section",

????action?=?"Index",

????id?=?"123"

});

????@Html.RouteLink(linkText:?"Route:Default",?routeName:?"Default",?new

{

????controller?=?"Home",

????action?=?"Index",

????id?=?"123"

});

這樣我們便可以為生成的URL指定路由名來(lái)生成相應(yīng)的URL

9.2.4?MVC區(qū)域

在路由沒(méi)有指定名稱空間的情況下,很容易產(chǎn)生二義性,即兩個(gè)同名的控制器同時(shí)匹配一個(gè)路由,我們可以通過(guò)在項(xiàng)目中使用唯一的控制器名稱來(lái)防止二義性,如下:對(duì)特定的路由指定一組用來(lái)定位控制器的名稱空間

????????????routes.MapRoute{"Default","{controller}/{action}/{id}",new?{controller="Home",action="Index",id=""},new?[]{?"AreasWeb.Controllers"});

第四個(gè)參數(shù)指定一個(gè)名稱空間數(shù)組

9.2.5?Catch-All?參數(shù)

Catch-all參數(shù)允許路由匹配具有任意數(shù)量的段的URL,參數(shù)中的值是不含查詢字符串的URL剩余部分

如:

????????routes.MapRoute("CatchAllRoute",?"/query/{query-name}/{*extrastuff}");

匹配如下:

URL???????????????????????????參數(shù)值

/query/select/a/b/c?????????extrastuff="a/b/c"

/query/select/a/b/c/????????extrastuff="a/b/c"

/query/select/??????????????extrastuff=""(路由仍然匹配,“catch-all捕獲了空字符串

9.2.6?段中的多個(gè)URL參數(shù)

路由的URL中可以存在多個(gè)參數(shù),如下:

l?{title}-{artist}

l?Album{title}and{artist}

l?{filename}.{ext}

為避免二義性,參數(shù)不能臨近,

如下:均為無(wú)效的URL

l?{title}{atrist}

l?DownLoad{filename}{ext}

路由URL在與傳入的請(qǐng)求匹配時(shí),它的字面值與請(qǐng)求精確匹配,而其中的URL參數(shù)是貪婪匹配,路由使每個(gè)URL參數(shù)盡可能的匹配更多的文本

如下:??????????????????????多參數(shù)路由匹配

路由URL?????????????請(qǐng)求的URL???????????????????路由數(shù)據(jù)的結(jié)果

{finename}.{ext}????/Foo.xml.aspx???????????????filename="Foo.xml"?ext="aspx"

My{title}-{cat}?????/MyHouser-dwelling??????????title="Houser"?ext="dwelling"

{foo}xyz{bar}???????/xyzxyzxyzblah??????????????foo="xyzxyz"?bar="blah"

9.2.7?StopRoutingHandler和IgnoreRoute

默認(rèn)情況下,路由機(jī)制將忽略那些映射到磁盤(pán)物理文件的請(qǐng)求。

方法如下:

????????public?static?void?RegisterRoutes(RouteCollection?routes)

????????{

????????????routes.IgnoreRoute("{resource}.axd/{*pathInfo}");//第一種方法

????????????routes.Add(new?Route("{resource}.axd/{@pathInfo}",new?StopRoutingHandler()));//第二種方法

}

9.2.9?揭秘路由如何生成URL

1、URL生成的高層次概述

路 由機(jī)制的核心是一個(gè)基于RouteCollection類(lèi)和RouteBase類(lèi)組成的簡(jiǎn)單抽象對(duì)象組成的算法。有許多中生成URL的方法,但是這些方法 都是以調(diào)用RouteCollection.GetVirtualPath方法的重載版本而結(jié)束的,該方法的重載版本如下:

Public?virtualPathData?GetVirtualPath(RequestContext?requestContext,RouteValueDictionary?values)

Public?virtualpathData?GetVirtualPath(RequestContext?requestContext,string?name,RouteValueDictionary?values)

第一個(gè)重載版本接受當(dāng)前的RequestContext以及由用戶指定用來(lái)選擇想要的路由值

l?路由集合通過(guò)Route.GetVirtualPath方法遍歷每個(gè)路由,類(lèi)似于在路由與傳入的請(qǐng)求匹配時(shí)所運(yùn)用的匹配邏輯

l?如果一個(gè)路由匹配,則返回一個(gè)包含了URL的VirtualPathData實(shí)例,及其他匹配信息,否則將返回空值,路由機(jī)制移向列表中的下一個(gè)路由

第二個(gè)重載版本接受了三個(gè)參數(shù),第二個(gè)參數(shù)為路由名稱,在路由集合中路由名稱是唯一的,指定了路由名稱之后便不需要遍歷每個(gè)路由,直接找到指定名稱的路由進(jìn)行匹配,如果匹配則返回VirtualPathData實(shí)例,否則返回空值

2、URL生成詳解

① 用戶調(diào)用RouteCollection.GetVirtualPath方法,并向它傳遞一個(gè)RequestContext對(duì)象、一個(gè)包含值的字典,以及用來(lái)選擇生成URL路由的名稱(可選參數(shù))

② 路由機(jī)制查看要求的路由URL參數(shù),并確保提供的路由值字典為每一個(gè)要求的參數(shù)提供一個(gè)值,否則URL生成程序立即中止,返回空值

③ 一 些路由可能包含沒(méi)有對(duì)應(yīng)的URL參數(shù)的默認(rèn)值。如:路由可能為category見(jiàn)提供了?一個(gè)默認(rèn)值"pastries",但是category不是路由 URL的一個(gè)參數(shù),這時(shí),如果用戶傳入的路由值字典為category提供了一個(gè)值,那么該值必須匹配category的默認(rèn)值

④ 路由機(jī)制然后應(yīng)用路由的約束,如果有的話,要查找約束

⑤ 路由匹配成功,可以通過(guò)查看每一個(gè)URL參數(shù),并嘗試用字典中的對(duì)應(yīng)值填充它,進(jìn)而生成URL

3、外界路由值

在一些情形中,URL生成程序還可以利用那些不是通過(guò)調(diào)用GetVirtualPath方法顯示提供的值

4、溢出參數(shù)

指在URL生成過(guò)程中使用、但是在路由定義中卻沒(méi)有指定的路由值。具體指的是路由的URL、默認(rèn)的字典和約束字典

如:路由定義如下:

????????????routes.MapRoute(

????????????????"Default",?//?路由名稱

????????????????"{controller}/{action}/{id}",?//?帶有參數(shù)的?URL

????????????????new

????????????????{

????????????????????controller?=?"Home",

????????????????????action?=?"Index",

????????????????????id?=?UrlParameter.Optional

????????????????}?//?參數(shù)默認(rèn)值

????????????);

上面路由的定義中不包括名為“page”的URL參數(shù),下面我們使用Url.RouteUrl方法渲染了URL,而不是生成連接:

@Url.RouteUrl(new?{controller="Report",action="List",page="123"});

5、該 行代碼生成的URL是:/Request/List?Page=2,但是我們指定的參數(shù)比需要的參數(shù)還要多,這個(gè)時(shí)候額外的參數(shù)會(huì)作為查詢字符串附加在生 成的URL之后,路由機(jī)制在選擇匹配的路由時(shí)并不是精確的匹配,它只是選擇足夠的匹配的路由,只要指定的參數(shù)滿足路由需要,額外參數(shù)無(wú)關(guān)緊要

6、Route類(lèi)生成URL的若干示例

routes.MapRoute("report",?"reports/{year}/{month}/{day}",?new{day?=?1});

則GetVirtualPath方法調(diào)用示例如下:

參數(shù)????????????????????????返回URL??????????????????????????說(shuō)明

Year=2007,month=1,day=1???/reports/2007/1/1???????????????直接匹配

Year=2007,month=1??????????/reports/2007/1?????????????????默認(rèn)day=1

Year=2007,month=1,????????/reports/2007/1/1?Category=123?溢出參數(shù)進(jìn)入生成的URL?????????????????????????????????????????????????

day=1,category=123?

Year=2007???????????????????返回空值?????????????????因?yàn)闆](méi)有提供足夠的匹配參數(shù)

9.3?揭秘路由如何綁定到操作

9.3.1?高層次請(qǐng)求的路由管道

主要由以下幾步組成:

① UrlRoutingModule?嘗試使用在RouteTable中注冊(cè)的路由匹配當(dāng)前請(qǐng)求

② 如果一個(gè)路由匹配成功,那么路由模塊將從匹配成功的路由中獲取IRouteHandler接口對(duì)象

③ 路由模塊由IRouteHandler接口的GetHandler方法,并返回用來(lái)處理請(qǐng)求的IHttpHandler對(duì)象

④ 調(diào)用HTTP處理程序中的ProcessRequest方法,將要處理的值傳給它

⑤ 在 ASP.NET?MVC?中,IRouteHandler是MvcRouteHandler類(lèi)的一個(gè)實(shí)例,MvcRouteHandler轉(zhuǎn)而返回一個(gè)實(shí) 現(xiàn)了IHttpHandler接口的MvcHandler對(duì)象,返回的MvcHandler對(duì)象主要用來(lái)實(shí)例化控制器,并調(diào)用該實(shí)例化控制器上的方法

9.3.2?路由數(shù)據(jù)

調(diào) 用GetRouteData方法將返回一個(gè)RouteData的實(shí)例,RouteData包含了關(guān)于匹配請(qǐng)求的路由的信息,如果匹配成功則會(huì)創(chuàng)建一個(gè)字 典,其中包含從URL中解析出的信息,并且路由還會(huì)為URL中的每一個(gè)參數(shù)向字典中添加一個(gè)鍵,如:{controller}/{action} /{id},所在的字典中至少包含三個(gè)鍵分別為controller、action、id

9.4?自定義路由約束

之前我們講過(guò)可以使用正則表達(dá)式對(duì)路由進(jìn)行細(xì)粒度的匹配控制,除此之前路由機(jī)制提供了一個(gè)具有單一Match方法的IRouteConstraint接口,該接口定義如下:

public?interface?IRouteConstraint

????????{

????????????bool?Match(HttpContextBase?httpContext,?Route?route,?string?parameterName,?RouteValueDictionary?values,?RouteDirection?routeDirection);

????????}

當(dāng)路由機(jī)制評(píng)估路由約束時(shí),如果約束值實(shí)現(xiàn)了IRouteConstraint接口,那么這將導(dǎo)致路由機(jī)制引擎調(diào)用路由約束上的IRouteConstraint.Match方法,以確定約束是否滿足給定的請(qǐng)求。

路由機(jī)制本身以HttpMethodConstraint類(lèi)的形式提供了IRouteConstraint接口的一個(gè)實(shí)現(xiàn)。如下:定義一個(gè)路由只相應(yīng)GET請(qǐng)求,其他請(qǐng)求不響應(yīng)

routes.MapRoute("name",?"{controller}",?null,?new

??????????????????????{

??????????????????????????httpMethod?=?new?HttpMethodConstraint("GET")

??????????????????????});

自定義的約束沒(méi)有必要關(guān)聯(lián)URL參數(shù),因此可以提供一個(gè)基于多個(gè)URL參數(shù)或一些其他約束

轉(zhuǎn)載于:https://www.cnblogs.com/tianguook/p/3969876.html

總結(jié)

以上是生活随笔為你收集整理的ASP.NET MVC3 学习心得------路由机制的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。