猿学~史上最全的ASP.NET MVC路由配置

本文详细介绍了ASP.NET MVC的路由配置,包括URL构造、路由规则、正则表达式匹配和路由测试。从默认路由到自定义规则,涵盖命名参数、匿名对象、可变长度路由等多个方面,并提供了各种示例和注意事项。
摘要由CSDN通过智能技术生成

先说一下基本的路由规则原则。基本的路由规则是从特殊到一般排列,也就是最特殊(非主流)的规则在最前面,最一般(万金油)的规则排在最后。这是因为匹配路由规则也是照着这个顺序的。如果写反了,那么即便你路由规则写对了那照样坐等404.

XD 首先说URL的构造。 其实这个也谈不上构造,只是语法特性吧。

URL构造

命名参数规范+匿名对象

1

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

构造路由然后添加

1

2

Route myRoute = newRoute("{controller}/{action}",newMvcRouteHandler());

routes.Add("MyRoute", myRoute);

直接方法重载+匿名对象

1

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

  个人觉得第一种比较易懂,第二种方便调试,第三种写起来比较效率吧。各取所需吧。本文行文偏向于第三种。

路由规则

 1.默认路由(MVC自带)

1

2

3

4

routes.MapRoute(

"Default",// 路由名称

"{controller}/{action}/{id}",// 带有参数的 URL

new{ controller = "Home", action = "Index", id = UrlParameter.Optional } // 参数默认值 (UrlParameter.Optional-可选的意思) );

2.静态URL段

1

2

3

4

5

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段(好吧这翻译暴露智商了)

1

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

这种情况如果访问 /Home/Index 的话,因为第三段(id)没有值,根据路由规则这个参数会被设为DefaultId

这个用viewbag给title赋值就能很明显看出

1

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

图不贴了,结果是标题显示为DefaultId。 注意要在控制器里面赋值,在视图赋值没法编译的。

4.再述默认路由

然后再回到默认路由。 UrlParameter.Optional这个叫可选URL段.路由里没有这个参数的话id为null。 照原文大致说法,这个可选URL段能用来实现一个关注点的分离。刚才在路由里直接设定参数默认值其实不是很好。照我的理解,实际参数是用户发来的,我们做的只是定义形式参数名。但是,如果硬要给参数赋默认值的话,建议用语法糖写到action参数里面。比如:

1

publicActionResult Index(stringid = "abcd"){ViewBag.Title = RouteData.Values["id"];returnView();}

5.可变长度路由。

1

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。这个非常非主流,不建议瞎搞。

1

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

但是这样写的话数组排名不分先后的&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值