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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

MVC --.Routing

發(fā)布時(shí)間:2025/3/21 c/c++ 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MVC --.Routing 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

.Routing的作用

第一講中實(shí)例的首頁(yè)地址是: localhost/home/index

我們發(fā)現(xiàn)訪問上面的地址, 最后會(huì)傳遞給 HomeController中名為index的action(即HomeController類中的index方法).

當(dāng)然服務(wù)器端不會(huì)自己去實(shí)現(xiàn)這個(gè)功能,? 關(guān)鍵點(diǎn)就是在Global.asax.cs文件中的下列代碼:

public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = "" } // Parameter defaults ); } protected void Application_Start() { RegisterRoutes(RouteTable.Routes); }

?

回來看我們的Url: localhost/home/index

localhost是域名, 所以首先要去掉域名部分: home/index

對(duì)應(yīng)了上面代碼中的這種URL結(jié)構(gòu): {controller}/{action}/{id}

因?yàn)槲覀兘⒘诉@種Url結(jié)構(gòu)的識(shí)別規(guī)則, 所以能夠識(shí)別出 Controller是home, action是index, id沒有則為默認(rèn)值"".

這就是Routing的第一個(gè)作用:

1.從Url中識(shí)別出數(shù)據(jù).比如controller,action和各種參數(shù).

如果跟蹤程序, 接下來我們會(huì)跳轉(zhuǎn)到HomeController中的Index()方法.? 這是Routing內(nèi)部為實(shí)現(xiàn)的第二個(gè)作用:

2.根據(jù)識(shí)別出來的數(shù)據(jù), 將請(qǐng)求傳遞給Controller和Action.

但從實(shí)例中我們并不知道Routing如何做的這部份工作.第五部分我做了深入講解.

四.Routing的使用

在分析Routing的實(shí)現(xiàn)原理前, 先學(xué)習(xí)如何使用Routing為ASP.NET MVC程序添加路由規(guī)則.

1. 使用MapRoute()方法.

這是最簡(jiǎn)單的為ASP.NET MVC添加識(shí)別規(guī)則的方法.此方法有如下重載:

MapRoute( string name, string url);MapRoute( string name, string url, object defaults);MapRoute( string name, string url, string[] namespaces);MapRoute( string name, string url, object defaults, object constraints);MapRoute( string name, string url, object defaults, string[] namespaces);MapRoute( string name, string url, object defaults, object constraints, string[] namespaces); ?

name參數(shù):

規(guī)則名稱, 可以隨意起名.當(dāng)時(shí)不可以重名,否則會(huì)發(fā)生錯(cuò)誤:
路由集合中已經(jīng)存在名為“Default”的路由。路由名必須是唯一的。

url參數(shù):

url獲取數(shù)據(jù)的規(guī)則, 這里不是正則表達(dá)式,? 將要識(shí)別的參數(shù)括起來即可, 比如: {controller}/{action}

最少只需要傳遞name和url參數(shù)就可以建立一條Routing(路由)規(guī)則.比如實(shí)例中的規(guī)則完全可以改為:

routes.MapRoute( "Default", "{controller}/{action}");

defaults參數(shù):

url參數(shù)的默認(rèn)值.如果一個(gè)url只有controller: localhost/home/

而且我們只建立了一條url獲取數(shù)據(jù)規(guī)則: {controller}/{action}

那么這時(shí)就會(huì)為action參數(shù)設(shè)置defaults參數(shù)中規(guī)定的默認(rèn)值. defaults參數(shù)是Object類型,所以可以傳遞一個(gè)匿名類型來初始化默認(rèn)值:

new { controller = "Home", action = "Index" }

實(shí)例中使用的是三個(gè)參數(shù)的MapRoute方法:

routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = "" } // Parameter defaults );

constraints參數(shù):

用來限定每個(gè)參數(shù)的規(guī)則或Http請(qǐng)求的類型.constraints屬性是一個(gè)RouteValueDictionary對(duì)象,也就是一個(gè)字典表, 但是這個(gè)字典表的值可以有兩種:

用于定義正則表達(dá)式的字符串。正則表達(dá)式不區(qū)分大小寫。

一個(gè)用于實(shí)現(xiàn) IRouteConstraint 接口且包含 Match 方法的對(duì)象。

通過使用正則表達(dá)式可以規(guī)定參數(shù)格式,比如controller參數(shù)只能為4位數(shù)字:

new { controller = @"\d{4}"} ?

通過第IRouteConstraint 接口目前可以限制請(qǐng)求的類型.因?yàn)镾ystem.Web.Routing中提供了HttpMethodConstraint類, 這個(gè)類實(shí)現(xiàn)了IRouteConstraint 接口. 我們可以通過為RouteValueDictionary字典對(duì)象添加鍵為"httpMethod", 值為一個(gè)HttpMethodConstraint對(duì)象來為路由規(guī)則添加HTTP 謂詞的限制, 比如限制一條路由規(guī)則只能處理GET請(qǐng)求:

httpMethod = new HttpMethodConstraint( "GET", "POST" )

完整的代碼如下:

routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = "" }, // Parameter defaults new { controller = @"\d{4}" , httpMethod = new HttpMethodConstraint( "GET", "POST" ) } );

當(dāng)然我們也可以在外部先創(chuàng)建一個(gè)RouteValueDictionary對(duì)象在作為MapRoute的參數(shù)傳入, 這只是語(yǔ)法問題.

namespaces參數(shù):

此參數(shù)對(duì)應(yīng)Route.DataTokens屬性. 官方的解釋是:

獲取或設(shè)置傳遞到路由處理程序但未用于確定該路由是否匹配 URL 模式的自定義值。

我目前不知道如何使用. 請(qǐng)高手指點(diǎn)

2.MapRoute方法實(shí)例

下面通過實(shí)例來應(yīng)用MapRoute方法. 對(duì)于一個(gè)網(wǎng)站,為了SEO友好,一個(gè)網(wǎng)址的URL層次不要超過三層:

localhost/{頻道}/{具體網(wǎng)頁(yè)}

其中域名第一層, 頻道第二層, 那么最后的網(wǎng)頁(yè)就只剩下最后一層了. 如果使用默認(rèn)實(shí)例中的"{controller}/{action}/{其他參數(shù)}"的形式會(huì)影響網(wǎng)站的SEO.

假設(shè)我們的網(wǎng)站結(jié)構(gòu)如下:

下面以酒店頻道為例, 是我創(chuàng)建的Routing規(guī)則:

public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); #region 酒店頻道部分 // hotels/list-beijing-100,200-3 routes.MapRoute( "酒店列表頁(yè)", "hotels/{action}-{city}-{price}-{star}", new { controller = "Hotel", action = "list", city = "beijing", price="-1,-1", star="-1" }, new { city=@"[a-zA-Z]*",price=@"(\d)+\,(\d)+", star="[-1-5]"} ); //hotels/所有匹配 routes.MapRoute( "酒店首頁(yè)", "hotels/{*values}", new { controller = "Hotel", action = "default", hotelid = "" } ); #endregion //網(wǎng)站首頁(yè). routes.MapRoute( "網(wǎng)站首頁(yè)", "{*values}", new { controller = "Home", action = "index"} ); } ?

實(shí)現(xiàn)的功能:

(1)訪問 localhost/hotels/list-beijing-100,200-3 會(huì)訪問酒店頻道的列表頁(yè),并傳入查詢參數(shù)

(2)訪問 localhost/hotels 下面的任何其他頁(yè)面地址, 都會(huì)跳轉(zhuǎn)到酒店首頁(yè).

(3)訪問 localhost 下面的任何地址, 如果未匹配上面2條, 則跳轉(zhuǎn)到首頁(yè).

簡(jiǎn)單總結(jié):

(1)Routing規(guī)則有順序(按照添加是的順序), 如果一個(gè)url匹配了多個(gè)Routing規(guī)則, 則按照第一個(gè)匹配的Routing規(guī)則執(zhí)行.

(2)由于上面的規(guī)則, 要將具體頻道的具體頁(yè)面放在最上方, 將頻道首頁(yè) 和 網(wǎng)站首頁(yè) 放在最下方.

(3) {*values} 表示后面可以使任意的格式.

3.使用Route類

MapRoute方法雖然簡(jiǎn)單, 但是他是本質(zhì)也是通過創(chuàng)建Route類的實(shí)例, 為RouteCollection集合添加成員.

下載最新版本的MSDN-Visual Studio 20008 SP1, 已經(jīng)可以找到Route類的說明.

創(chuàng)建一個(gè)Route類實(shí)例,最關(guān)鍵的是為以下幾個(gè)屬性賦值:

屬性名稱說明舉例
Constraints獲取或設(shè)置為 URL 參數(shù)指定有效值的表達(dá)式的詞典。 {controller}/{action}/{id}
DataTokens獲取或設(shè)置傳遞到路由處理程序但未用于確定該路由是否匹配 URL 模式的自定義值。 new RouteValueDictionary { { "format", "short" } }
Defaults獲取或設(shè)置要在 URL 不包含所有參數(shù)時(shí)使用的值。new { controller = "Home", action = "Index", id = "" }
RouteHandler獲取或設(shè)置處理路由請(qǐng)求的對(duì)象。new MvcRouteHandler()
Url獲取或設(shè)置路由的 URL 模式。 new { controller = @"[^\.]*" }


這些屬性除了RouteHandler以外, 其他的都對(duì)應(yīng)MapRoute方法的參數(shù).RouteHandler是實(shí)現(xiàn)了IRouteHandler接口的對(duì)象.關(guān)于此接口的作用在第五部分Routing深入解析中做講解.

五.Routing深入解析

對(duì)于一個(gè)一般開發(fā)人員來說, 上面的知識(shí)已經(jīng)完全足夠你使用ASP.NET MVC時(shí)使用Routing了.

接下來的部分我將深入Routing的機(jī)制講解Routing的高級(jí)應(yīng)用.但是因?yàn)槭?#34;高級(jí)應(yīng)用", 加上這篇文章已經(jīng)太長(zhǎng)了, 再加上馬上今天就過去了, "每日一篇"的承諾一定要兌現(xiàn)的, 所以不會(huì)對(duì)所有細(xì)節(jié)進(jìn)行講解. 或者也可以略過此部分.

Routing如何將請(qǐng)求傳遞給Controller?上面講解Routing作用的時(shí)候, 我們就分析出Routing會(huì)將請(qǐng)求傳遞給Controller, 但是Routing如何做的這部份工作我們卻看不到.關(guān)鍵在于MapRoute()這個(gè)方法封裝了具體的細(xì)節(jié).

雖然MapRoute方法是RouteCollection對(duì)象的方法,但是卻被放置在System.Web.Mvc程序集中, 如果你的程序只引用了System.Web.Routing, 那么RouteCollection對(duì)象是不會(huì)有MapRoute方法的. 但是如果你同又引用了System.Web.Mvc, 則在mvc的dll中為RouteCollection對(duì)象添加了擴(kuò)展方法:

public static void IgnoreRoute(this RouteCollection routes, string url); public static void IgnoreRoute(this RouteCollection routes, string url, object constraints); public static Route MapRoute(this RouteCollection routes, string name, string url); public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults); public static Route MapRoute(this RouteCollection routes, string name, string url, string[] namespaces); public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints); public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces); public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces);

RouteCollection是一個(gè)集合,他的每一項(xiàng)應(yīng)該是一個(gè)Route對(duì)象. 但是我們使用MapRoute時(shí)并沒有創(chuàng)建這個(gè)對(duì)象, 這是因?yàn)楫?dāng)我們將MapRoute方法需要的參數(shù)傳入時(shí), 在方法內(nèi)部會(huì)根據(jù)參數(shù)創(chuàng)建一個(gè)Route對(duì)象:

public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces) { if (routes == null) { throw new ArgumentNullException("routes"); } if (url == null) { throw new ArgumentNullException("url"); } Route route = new Route(url, new MvcRouteHandler()) { Defaults = new RouteValueDictionary(defaults), Constraints = new RouteValueDictionary(constraints) }; if ((namespaces != null) && (namespaces.Length > 0)) { route.DataTokens = new RouteValueDictionary(); route.DataTokens["Namespaces"] = namespaces; } routes.Add(name, route); return route; }

上面就是MapRoute方法的實(shí)現(xiàn), 至于在創(chuàng)建Route對(duì)象時(shí)第二個(gè)參數(shù)是一個(gè)MvcRouteHandler, 它是一個(gè)實(shí)現(xiàn)了IRouteHandler接口的類. IRouteHandler十分簡(jiǎn)單只有一個(gè)方法:

IHttpHandler GetHttpHandler(RequestContext requestContext);

參數(shù)是一個(gè)RequestContext 類實(shí)例, 這個(gè)類的結(jié)構(gòu)也很簡(jiǎn)單:

public class RequestContext { public RequestContext(HttpContextBase httpContext, RouteData routeData); public HttpContextBase HttpContext { get; } public RouteData RouteData { get; } }

其中的一個(gè)屬性RouteData就包含了Routing根據(jù)Url識(shí)別出來各種參數(shù)的值, 其中就有Controller和Action的值.

歸根結(jié)底, ASP.NET MVC最后還是使用HttpHandler處理請(qǐng)求. ASP.NET MVC定義了自己的實(shí)現(xiàn)了IHttpHandler接口的Handler:MvcHandler,? 因?yàn)镸vcRouteHandler的GetHttpHandler方法最后返回的就是MvcHandler.?

MvcHandler的構(gòu)造函數(shù)需要傳入RequestContext 對(duì)象, 也就是傳入了所有的所有需要的數(shù)據(jù), 所以最后可以找到對(duì)應(yīng)的Controller和Action, 已經(jīng)各種參數(shù).

六.測(cè)試Routing

因?yàn)橐粋€(gè)Url會(huì)匹配多個(gè)routing規(guī)則, 最后常常會(huì)遇到規(guī)則寫錯(cuò)或者順序不對(duì)的問題.于是我們希望能夠看到Url匹配Routing的結(jié)果.

其中最簡(jiǎn)單的辦法就是使用RouteDebug輔助類. 這個(gè)類需要單獨(dú)下載dll組件, 我將此組件的下載放在了博客園上:

http://files.cnblogs.com/zhangziqiu/RouteDebug-Binary.zip

解壓縮后是一個(gè)DLL文件, 將這個(gè)DLL文件添加到項(xiàng)目中并且添加引用.

使用方法很簡(jiǎn)單, 只需要在Application_Start方法中添加一句話:

RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes);


比如下面是我的示例中的代碼:

protected void Application_Start() { RegisterRoutes(RouteTable.Routes); RouteDebug.RouteDebugger.RewriteRoutesForTesting(RouteTable.Routes); }


現(xiàn)在你訪問任何URL, 都會(huì)出現(xiàn)RouteDebug頁(yè)面, 如下:

其中不僅有你的所有Routing規(guī)則, 還顯示了是否匹配.并且按照順序列出. 還有識(shí)別的參數(shù)列表.

當(dāng)你不想測(cè)試Routing規(guī)則的時(shí)候則注釋掉這一段, 即可回復(fù)跳轉(zhuǎn)到View對(duì)象上.

七.總結(jié)

本文講解了ASP.NET MVC中一個(gè)關(guān)鍵的組件:Routing的使用. System.Web.Routing在Framework3.5 SP1中已經(jīng)集成, 也就是說雖然我們還沒有ASP.NET MVC的正式版, 但是Routing組件卻已經(jīng)提早發(fā)布了. 因?yàn)镽outing是一個(gè)相對(duì)獨(dú)立的組件, 不僅能和ASP.NET MVC配額使用, 也可以用于任何需要URL路由的項(xiàng)目. 另外Routing的作用和Url重寫(Url Rewrite)是有區(qū)別的, 你會(huì)發(fā)現(xiàn)Routing和Url Rewrite相比其實(shí)很麻煩, 無論是添加規(guī)則還是傳遞參數(shù).對(duì)UrlRewite感興趣的可以去尋找UrlRewrite.dll這個(gè)組件, 很簡(jiǎn)單很強(qiáng)大, 有關(guān)兩者的異同以及如何使用UrlRewrite這里不在多說了.

本文的示例下載地址:

http://files.cnblogs.com/zhangziqiu/Demo-2.rar


出處:http://www.cnblogs.com/zhangziqiu/

轉(zhuǎn)載于:https://www.cnblogs.com/dudu837/archive/2010/08/28/1810743.html

總結(jié)

以上是生活随笔為你收集整理的MVC --.Routing的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 麻豆三级 | 蜜臀一区二区三区精品免费视频 | 人妻无码久久精品人妻 | 九九热视频免费观看 | av黄色大片| 亚洲精品成av人片天堂无码 | 波多野42部无码喷潮在线 | 四虎影视精品 | 中文字幕av久久 | 黄色无遮挡网站 | 一区二区国产电影 | 免费观看成人鲁鲁鲁鲁鲁视频 | 亚洲a一区 | 欧美综合区 | 久久久久99 | 26uuu成人网 国产精品久久久久久久久久直播 | 91国模少妇一区二区三区 | 亚洲综合久久久 | jizz韩国 | 欧美激情亚洲色图 | 国产视频三级 | 一本一道久久a久久精品综合 | 黄色免费一级视频 | 色哟哟入口国产精品 | av第一福利| 日韩精品福利视频 | 国产一区二区三区在线看 | 秋葵视频在线 | 全毛片| 999精品视频 | 99爱爱视频 | 精品熟妇无码av免费久久 | 一区二区日韩精品 | 国产精品欧美一区喷水 | 精品日韩| 夜夜摸夜夜操 | 色婷婷av一区二区三区之红樱桃 | 无码精品人妻一二三区红粉影视 | 男女草比视频 | 日本黄色片免费 | 欧美国产成人精品一区二区三区 | 精品亚洲永久免费精品 | 相亲对象是问题学生动漫免费观看 | 国产一区在线播放 | 日韩精品一区二区三区视频在线观看 | 99re在线播放| www.色妞| 四虎国产在线观看 | 精国产人伦一区二区三区 | 一级大黄毛片 | 国产无遮挡又黄又爽免费视频 | 自拍一区在线 | 日韩激情电影在线 | 99久久久久 | 阿v天堂在线观看 | 国内久久精品视频 | 99热麻豆 | 国产精品白嫩极品美女视频 | 东方成人av | 国产男男一区二区三区 | 亚洲av成人片色在线观看高潮 | 四虎首页| 国产成人精品久久久 | 一区二区久久精品66国产精品 | 久久综合精品视频 | 少妇4p| 午夜精品一区二 | 91免费在线视频观看 | 日韩欧美视频在线播放 | 在线观看国产小视频 | 色妞干网| 亚洲热在线视频 | 欧美爱爱免费视频 | 四虎4hu| 亚洲精品aⅴ中文字幕乱码 国产精品调教视频 | 在线免费a视频 | 亚洲欧美网 | 欧美丰满少妇 | 丨国产丨调教丨91丨 | 玖玖精品视频 | 99免费精品 | 久久精品超碰 | 中文国产字幕 | 黄色免费网站观看 | yjizz国产 | 国产精品伦一区二区三级古装电影 | 啪啪福利| 噜噜在线视频 | 女人私密又肥又大 | 国产伦理一区二区三区 | 亚洲视频一区二区在线观看 | 日日射天天干 | 自拍偷拍欧美 | 91在线精品视频 | 国产精品15p | 中文字幕精品亚洲 | 欧美激情自拍偷拍 | 亚欧洲乱码视频 | av2014天堂 |