mvc 生成输出url

    最近一直在学习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>
View Code

请各位注意传入的匿名类型的那几个属性

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                 );
View Code

我把first这条路由提前了,那么我得到的结果是:

http://localhost:2154/?category=球类&page=2

为什么会得到这个结果呢?

这是因为它先匹配是fist这条路由,它满足{controller}/{action}和片段量,并且id是可有可无所以,直接匹配它,直接放回,剩下的参数category和page以?查询字符串出现。所以越具体的路由应该放在前面,越抽象的应该放到后面

4,符合各种约束,例如正则表达式什么的。

   以上就是我对mvc生成url的理解,@Html.ActionLink方法也是一样的。

  第一次写博客请见谅哈。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。