国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

史上最全的ASP.NET MVC路由配置,以后RouteConfig再弄不懂神仙都難救你啦~

2019-11-17 01:41:47
字體:
來源:轉載
供稿:網友
史上最全的asp.net MVC路由配置,以后RouteConfig再弄不懂神仙都難救你啦~

原文http://m.survivalescaperooms.com/zeusro/p/RouteConfig.html裝載注明出處,爬蟲請自重。

繼續延續坑爹標題系列。其實只是把aPRess.pro.asp.net.mvc.4.framework里的CHAPTER 13翻譯過來罷了,當做自己總結吧。內容看看就好,排版就不要吐槽了,反正我知道你也不會反對的。

先說一下基本的路由規則原則。基本的路由規則是從特殊到一般排列,也就是最特殊(非主流)的規則在最前面,最一般(萬金油)的規則排在最后。這是因為匹配路由規則也是照著這個順序的。如果寫反了,那么即便你路由規則寫對了那照樣坐等404.

XD 首先說URL的構造。 其實這個也談不上構造,只是語法特性吧。

URL構造

命名參數規范+匿名對象

routes.MapRoute(name: "Default",url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); 

構造路由然后添加

Route myRoute = new Route("{controller}/{action}", new MvcRouteHandler());routes.Add("MyRoute", myRoute); 

直接方法重載+匿名對象

routes.MapRoute("ShopSchema", "Shop/{action}", new { controller = "Home" }); 

  個人覺得第一種比較易懂,第二種方便調試,第三種寫起來比較效率吧。各取所需吧。本文行文偏向于第三種。

路由規則

1.默認路由(MVC自帶)

routes.MapRoute( "Default", // 路由名稱"{controller}/{action}/{id}", // 帶有參數的 URL new { controller = "Home", action = "Index", id = UrlParameter.Optional } // 參數默認值 (UrlParameter.Optional-可選的意思) );

2.靜態URL段

routes.MapRoute("ShopSchema2", "Shop/OldAction", new { controller = "Home", action = "Index" }); routes.MapRoute("ShopSchema", "Shop/{action}", new { controller = "Home" }); routes.MapRoute("ShopSchema2", "Shop/OldAction.js", new { controller = "Home", action = "Index" });

沒有占位符路由就是現成的寫死的。

比如這樣寫然后去訪問http://localhost:XXX/Shop/OldAction.js,response也是完全沒問題的。 controller , action , area這三個保留字就別設靜態變量里面了。

3.自定義常規變量URL段(好吧這翻譯暴露智商了)

routes.MapRoute("MyRoute2", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "DefaultId" }); 

這種情況如果訪問 /Home/Index 的話,因為第三段(id)沒有值,根據路由規則這個參數會被設為DefaultId

這個用viewbag給title賦值就能很明顯看出

ViewBag.Title = RouteData.Values["id"]; 

圖不貼了,結果是標題顯示為DefaultId。 注意要在控制器里面賦值,在視圖賦值沒法編譯的。

4.再述默認路由

然后再回到默認路由。 UrlParameter.Optional這個叫可選URL段.路由里沒有這個參數的話id為null。 照原文大致說法,這個可選URL段能用來實現一個關注點的分離。剛才在路由里直接設定參數默認值其實不是很好。照我的理解,實際參數是用戶發來的,我們做的只是定義形式參數名。但是,如果硬要給參數賦默認值的話,建議用語法糖寫到action參數里面。比如:

public ActionResult Index(string id = "abcd"){ViewBag.Title = RouteData.Values["id"];return View();} 

5.可變長度路由。

routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }); 

在這里id和最后一段都是可變的,所以 /Home/Index/dabdafdaf 等效于 /Home/Index//abcdefdjldfiaeahfoeiho 等效于 /Home/Index/All/Delete/Perm/.....

6.跨命名空間路由

這個提醒一下記得引用命名空間,開啟IIS網站不然就是404。這個非常非主流,不建議瞎搞。

routes.MapRoute("MyRoute","{controller}/{action}/{id}/{*catchall}", new { controller = "Home", action = "Index", id = UrlParameter.Optional },new[] { "URLsAndRoutes.AdditionalControllers", "UrlsAndRoutes.Controllers" }); 

但是這樣寫的話數組排名不分先后的,如果有多個匹配的路由會報錯。 然后作者提出了一種改進寫法。

routes.MapRoute("AddContollerRoute","Home/{action}/{id}/{*catchall}",new { controller = "Home", action = "Index", id = UrlParameter.Optional },new[] { "URLsAndRoutes.AdditionalControllers" }); routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}", new { controller = "Home", action = "Index", id = UrlParameter.Optional },new[] { "URLsAndRoutes.Controllers" });

這樣第一個URL段不是Home的都交給第二個處理 最后還可以設定這個路由找不到的話就不給后面的路由留后路啦,也就不再往下找啦。

Route myRoute = routes.MapRoute("AddContollerRoute", "Home/{action}/{id}/{*catchall}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new[] { "URLsAndRoutes.AdditionalControllers" });  myRoute.DataTokens["UseNamespaceFallback"] = false; 

7.正則表達式匹配路由

routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}", new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new { controller = "^H.*"}, new[] { "URLsAndRoutes.Controllers"});

約束多個URL

routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}",new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new { controller = "^H.*", action = "^Index$|^About$"}, new[] { "URLsAndRoutes.Controllers"}); 

8.指定請求方法

routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}",new { controller = "Home", action = "Index", id = UrlParameter.Optional }, new { controller = "^H.*", action = "Index|About", httpMethod = new HttpMethodConstraint("GET") }, new[] { "URLsAndRoutes.Controllers" }); 

9.WebForm支持

           routes.MapPageRoute("", "", "~/Default.aspx");            routes.MapPageRoute("list", "Items/{action}", "~/Items/list.aspx", false, new RouteValueDictionary { { "action", "all" } });            routes.MapPageRoute("show", "Show/{action}", "~/show.aspx", false, new RouteValueDictionary { { "action", "all" } });            routes.MapPageRoute("edit", "Edit/{id}", "~/edit.aspx", false, new RouteValueDictionary { { "id", "1" } }, new RouteValueDictionary { { "id", @"/d+" } });

具體的可以看

使用Asp.Net4新特性路由創建WebForm應用

或者官方msdn

10.MVC5的RouteAttribute

首先要在路由注冊方法那里

            //啟用路由特性映射            routes.MapMvcAttributeRoutes();

這樣

[Route("Login")]

route特性才有效.該特性有好幾個重載.還有路由約束啊,順序啊,路由名之類的.

其他的還有路由前綴,路由默認值

[RoutePrefix("reviews")][Route("{action=index}")]public class ReviewsController : Controller{}

路由構造

// eg: /users/5[Route("users/{id:int}"]public ActionResult GetUserById(int id) { ... } // eg: users/ken[Route("users/{name}"]public ActionResult GetUserByName(string name) { ... }

參數限制

// eg: /users/5// but not /users/10000000000 because it is larger than int.MaxValue,// and not /users/0 because of the min(1) constraint.[Route("users/{id:int:min(1)}")]public ActionResult GetUserById(int id) { ... }

ConstraintDescriptionExample
alphaMatches uppercase or lowercase Latin alphabet characters (a-z, A-Z){x:alpha}
boolMatches a Boolean value.{x:bool}
datetimeMatches aDateTimevalue.{x:datetime}
decimalMatches a decimal value.{x:decimal}
doubleMatches a 64-bit floating-point value.{x:double}
floatMatches a 32-bit floating-point value.{x:float}
guidMatches a GUID value.{x:guid}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 垣曲县| 竹溪县| 南乐县| 泽普县| 新营市| 新巴尔虎右旗| 莲花县| 普定县| 长寿区| 桂阳县| 隆德县| 康乐县| 浮山县| 古浪县| 黔南| 镇平县| 克拉玛依市| 芜湖市| 浦北县| 开平市| 平阳县| 慈利县| 墨竹工卡县| 贡觉县| 年辖:市辖区| 新建县| 蒲城县| 惠东县| 涞水县| 永川市| 新泰市| 黄浦区| 会理县| 涪陵区| 石景山区| 滨海县| 星子县| 江城| 德安县| 张家界市| 广安市|