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

歡迎訪問 生活随笔!

生活随笔

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

asp.net

ASP.NET MVC学习之路由篇(2)

發(fā)布時(shí)間:2025/5/22 asp.net 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ASP.NET MVC学习之路由篇(2) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
ASP.NET MVC學(xué)習(xí)之路由篇(2) 原文:ASP.NET MVC學(xué)習(xí)之路由篇(2)

繼ASP.NET MVC學(xué)習(xí)之路由篇(1)后繼續(xù)學(xué)習(xí)。

7.解決與物理路徑的沖突

? ? ? 當(dāng)發(fā)送一個(gè)請(qǐng)求至ASP.NET MVC時(shí),其實(shí)會(huì)檢查網(wǎng)站中存不存在這個(gè)請(qǐng)求的物理路徑文件,如果存在的話,就會(huì)直接將這個(gè)物理文件返回。但是有時(shí)候我們需要它執(zhí)行控制器的某個(gè)方法,而不是直接將這個(gè)物理文件返回。那么我們就需要這節(jié)知識(shí)。下面我們先在網(wǎng)站根目錄中新建一個(gè) Test.html ,在其中隨便寫上一些內(nèi)容,然后訪問。再在RouteConfig.cs中寫入如下代碼:

1 public class RouteConfig 2 { 3 public static void RegisterRoutes(RouteCollection routes) 4 { 5 routes.RouteExistingFiles = true; 6 7 routes.MapRoute( 8 name: "Default2", 9 url: "Test.html", 10 defaults: new { controller = "Home", action = "List" } 11 ); 12 } 13 }

這個(gè)時(shí)候我們?cè)僦匦滤⑿聻g覽器,那么我們就可以看到控制器返回的結(jié)果了,這樣我們就解決了物理路徑和路由之間的沖突問題了。

?

8.繞過路由系統(tǒng)

? ? ? ?如果我們有一些URL路徑不希望通過路由系統(tǒng),那么我們就可以利用這節(jié)知識(shí)。

下面是RouteConfig.cs的內(nèi)容:

1 public class RouteConfig 2 { 3 public static void RegisterRoutes(RouteCollection routes) 4 { 5 routes.IgnoreRoute("webResources.axd{*pathinfo}"); 6 7 routes.MapRoute( 8 name: "Default2", 9 url: "Test.html", 10 defaults: new { controller = "Home", action = "List" } 11 ); 12 } 13 }

?

9.自定義路由系統(tǒng)

?如果上面的技術(shù)還無法解決你的問題,那么我們下面將會(huì)介紹如何自定義路由系統(tǒng)。自定義路由系統(tǒng)只需要繼承RouteBase并實(shí)現(xiàn)兩個(gè)方法,如下:

(1):GetRouteData

(2):GetVirtualPath

下面是我寫的一個(gè)簡(jiǎn)單示例,用來判斷訪問者是否是移動(dòng)設(shè)備,如果是移動(dòng)設(shè)備則路由到前綴為M的控制器處理請(qǐng)求,否則返回NULL交由默認(rèn)的路由

處理,下面為我的源碼:

1 public class CustomRouteBase : RouteBase 2 { 3 private List<String> userAgent; 4 5 public CustomRouteBase(params String[] userAgents) 6 { 7 userAgent = userAgents.ToList(); 8 } 9 10 public override RouteData GetRouteData(HttpContextBase httpContext) 11 { 12 RouteData rd = new RouteData(this, new MvcRouteHandler()); 13 Regex r = new Regex(@"/(\w+)", RegexOptions.IgnoreCase); 14 MatchCollection mc = r.Matches(httpContext.Request.Path); 15 String agent = httpContext.Request.UserAgent.ToLower(); 16 foreach (String item in userAgent) 17 { 18 if (agent.Contains(item)) 19 { 20 if (mc.Count >= 2) 21 { 22 rd.Values.Add("controller", "M" + mc[0].Groups[1].Value.ToString()); 23 rd.Values.Add("action", mc[1].Groups[1].Value.ToString()); 24 } 25 else 26 { 27 rd.Values.Add("controller", "MHome"); 28 rd.Values.Add("action", "Index"); 29 } 30 return rd; 31 } 32 } 33 return null; 34 } 35 36 public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) 37 { 38 return null; 39 } 40 }

?最后我們將該自定義路由添加進(jìn)來(RouteConfig.cs):

1 public class RouteConfig 2 { 3 public static void RegisterRoutes(RouteCollection routes) 4 { 5 routes.Add(new CustomRouteBase("iphone", "ipad", "android")); 6 7 routes.MapRoute( 8 name: "Default2", 9 url: "Test.html", 10 defaults: new { controller = "Home", action = "List" } 11 ); 12 } 13 }

?現(xiàn)在你新建一個(gè)MHome的控制器,然后訪問看看(建議使用Google瀏覽器,并通過開發(fā)者工具改變UserAgent即可快速看到效果)。

?

10.自定義路由處理程序

或許你會(huì)覺得ASP.NET MVC的控制器太麻煩,相比而言有些功能你更希望使用一般處理程序。但是訪問的時(shí)候必須使用物理路徑又發(fā)覺麻煩,那么通過學(xué)習(xí)這節(jié),你將可以將一般處理程序也加入到路由中,并且可控性很強(qiáng)。

首先我們必須新建一個(gè)實(shí)現(xiàn)IRouteHandler接口的類:

1 public class DonwloadHandler : IRouteHandler 2 { 3 4 public IHttpHandler GetHttpHandler(RequestContext requestContext) 5 { 6 return new CustomHandler(); 7 } 8 } 9 10 public class CustomHandler : IHttpHandler 11 { 12 13 public bool IsReusable 14 { 15 get { return false; } 16 } 17 18 public void ProcessRequest(HttpContext context) 19 { 20 context.Response.Write("download model"); 21 } 22 }

?你們可以看到上面的源碼,我是直接在下面新建了一個(gè)實(shí)現(xiàn)IHttpHandler的類,并且在GetHttpHandler中將該類的實(shí)例返回,當(dāng)然你還可以在這個(gè)方法中進(jìn)行判斷以便根據(jù)實(shí)際情況交由不同的一般處理程序去處理請(qǐng)求。

下面就是將這個(gè)路由處理程序添加到路由中,這里我們映射到MyTest這個(gè)路徑:

1 public class RouteConfig 2 { 3 public static void RegisterRoutes(RouteCollection routes) 4 { 5 routes.Add(new Route("MyTest",new DonwloadHandler())); 6 7 routes.MapRoute( 8 name: "Default2", 9 url: "Test.html", 10 defaults: new { controller = "Home", action = "List" } 11 ); 12 } 13 }

?接著我們?cè)L問http://localhost:2392/MyTest就可以看到結(jié)果了。

posted on 2014-05-20 14:05 NET未來之路 閱讀(...) 評(píng)論(...) 編輯 收藏

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

總結(jié)

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

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