最近一直在学习mvc,其中对于 Url.Action生成的url感到很困惑。官方的解释的基于路由方案生成的url。问题是,怎样基于,怎样选择,没有过多的解释。网上找了很多资料,也看不懂,最后还是在pro asp.net mvc3 framework这本书看明白了。
我的路由方案是这样的
1 public static void RegisterRoutes(RouteCollection routes) 2 { 3 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 4 5 routes.MapRoute 6 ( 7 null, 8 "", 9 new { controller = "Product", action = "List", category = (string)null, page = 1 }, 10 new { page = @"\d+" } 11 ); 12 13 routes.MapRoute 14 ( 15 null, 16 "Page{page}", 17 new { controller = "Product", action = "List", category = (string)null }, 18 new { page = @"\d+" } 19 ); 20 21 routes.MapRoute 22 ( 23 null, 24 "{category}", 25 new { controller = "Product", action = "List", page = 1 } 26 27 ); 28 29 routes.MapRoute 30 ( 31 null, 32 "{category}/Page{page}", 33 new { controller = "Product", action = "List" }, 34 new { page = @"\d+" } 35 ); 36 37 routes.MapRoute( 38 name: null, 39 url: "{controller}/{action}/{id}", 40 defaults: new { controller = "Product", action = "List", id = UrlParameter.Optional } 41 ); 42 43 44 45 }
这是我需要输出的设置
1 <div class="pager"> 2 @Html.PagingLinks(Model.pagingInfo, x => Url.Action("List", new { controller = "Product", action= "List", category = Model.CurrentCategory, page = x })) 3 </div>
请各位注意传入的匿名类型的那几个属性
new {
controller = "Product",
action= "List",
category = Model.CurrentCategory,
page = x })
)
最终它匹配
routes.MapRoute
(
null,
"{category}/Page{page}",
new { controller = "Product", action = "List" },
new { page = @"\d+" }
);
这条路由,生成的url就像是这样
http://localhost:2154/球类/Page2
接下来就是要解释为什么会这样呢。
生成url的原则(对书的总结哈),我自己的总结是:
1、明个片段名必须都得到匹配(有默认值的,而你提供的匿名参数可以没有该变量)例如
routes.MapRoute(
name: null,
url: "{controller}/{action}/{id}",
defaults: new { controller = "Product", action = "List" }
);
这条路由你只需提供new{id=5}就能匹配到了
2、如果片段名满足了,那只读默认量要么没有,要么必须一模一样,例如
routes.MapRoute
(
null,
"{category}",
new { controller = "Product", action = "List", page = 1 }
);
那么当你提供的匿名参数的时候,page参数要么没有,有的话必须是1,否则直接不匹配,哪怕你已经匹配了category这个片段量
3、基于路由方案生成的url不是以最佳路由生成,而是以最先找到生成,例如:
1 routes.MapRoute( 2 name: "fist", 3 url: "{controller}/{action}/{id}", 4 defaults: new { controller = "Product", action = "List", id = UrlParameter.Optional } 5 ); 6 routes.MapRoute 7 ( 8 "second", 9 "{category}/Page{page}", 10 new { controller = "Product", action = "List" }, 11 new { page = @"\d+" } 12 );
我把first这条路由提前了,那么我得到的结果是:
http://localhost:2154/?category=球类&page=2
为什么会得到这个结果呢?
这是因为它先匹配是fist这条路由,它满足{controller}/{action}和片段量,并且id是可有可无所以,直接匹配它,直接放回,剩下的参数category和page以?查询字符串出现。所以越具体的路由应该放在前面,越抽象的应该放到后面
4,符合各种约束,例如正则表达式什么的。
以上就是我对mvc生成url的理解,@Html.ActionLink方法也是一样的。
第一次写博客请见谅哈。