最近一直在学习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方法也是一样的。

第一次写博客请见谅哈。

转载于:https://www.cnblogs.com/hhhj/p/4368978.html

mvc 生成输出url相关推荐

  1. 以其他控制器为目标 在视图中生成输出URL

    结果呢:<a href="/Admin">This targets another controller</a> 转载于:https://www.cnblo ...

  2. MVC中的URL路由(一)

    URL路由系统通过对请求地址进行解析从而得到以目标Controller名称为核心的路由数据.Url路由系统最初是为了实现请求url与物理文件路径分离而建立的,MVC的Url Route是将Url地址与 ...

  3. ASP.NET MVC 生成简单的 xml 权限结构

    ASP.NET MVC 生成简单的 xml 权限结构 当我的一个项目到尾声时,发现系统很多模块权限有遗漏.部分模块权限遗漏是由于前期开发速度太快,开发人员未先给模块加权限而后再编写该模块功能代码.当我 ...

  4. php国外地址生成,thinkphp url生成

    为了配合所使用的URL模式,我们需要能够动态的根据当前的URL设置生成对应的URL地址,为此,ThinkPHP内置提供了U方法,用于URL的动态生成,可以确保项目在移植过程中不受环境的影响. 定义规则 ...

  5. php循环输出url,PHP 输出URL的快捷方式的实现方法

    这篇文章主要为大家详细介绍了PHP 输出URL的快捷方式的实现方法,具有一定的参考价值,可以用来参考一下. 感兴趣的小伙伴,下面一起跟随512笔记的小玲来看看吧! 代码如下: /* 512笔记 www ...

  6. boost::spirit模块实现从一个包含键/值对的容器中生成输出的测试程序

    boost::spirit模块实现从一个包含键/值对的容器中生成输出的测试程序 实现功能 C++实现代码 实现功能 boost::spirit模块实现从一个包含键/值对的容器中生成输出的测试程序 C+ ...

  7. php如何生成伪静态url,thinkphp控制器(三) 伪静态及URL生成

    URL伪静态通常是为了满足更好的SEO效果,ThinkPHP支持伪静态URL设置,可以通过设置URL_HTML_SUFFIX参数随意在URL的最后增加你想要的静态后缀,而不会影响当前操作的正常执行.例 ...

  8. MVC生成CheckBoxList并对其验证

    原文:MVC生成CheckBoxList并对其验证 通过扩展方法,可以让CheckBox水平排列,生成CheckBoxList,正如"MVC扩展生成CheckBoxList并水平排列&quo ...

  9. QQ音乐关键字搜索并生成下载url

    QQ音乐关键字搜索并生成下载url 1. 获取搜索的歌单信息 ​ 通过在QQ音乐进行关键字搜索,并通过F12检测,发现网页给网站https://c.y.qq.com/soso/fcgi-bin/cli ...

最新文章

  1. 树链剖分 ---- 2021杭电多校 1002 I love tree[详解]
  2. SSM实现学生宿舍管理系统
  3. 嵌入式Linux教程:安装VMware Tools VMware Tools显示灰色解决方法
  4. [转载]如何在只能力加载的有限元程序里面实现按位移加载
  5. android 使用String.format(%.2f,67.876)自已定义语言(俄语、西班牙语)会把小数点变为逗号...
  6. MaCfee导致Asp.net无法发送邮件的解决办法
  7. Flowable学习笔记(一、入门)
  8. [vue] 在.vue文件中style是必须的吗?那script是必须的吗?为什么?
  9. 联想杨元庆:没必要做操作系统和芯片;华为Mate 20 Pro被迫退出安卓 Q Beta;GitHub推赚钱新利器 | 极客头条...
  10. React Redux: 从文档看源码 - Components篇
  11. python爬app视频_python爬取抖音APP视频教程
  12. Java打印菱形源码及介绍
  13. MXY---Docker
  14. PGP软件的安装及汉化
  15. Android Studio安装(本人也是站在巨人肩膀上学习~)
  16. 形状的度量Measures of Shape
  17. 广色域图片Android,广色域手机很厉害?其实安卓手机屏幕的色彩问题一
  18. 基于卷积神经网络(CNN)的图像识别 之 火焰识别
  19. GST: Grouped Spatial-Temporal Aggregation for Efficient Action Recognition 论文阅读
  20. win10+yolov5尝鲜体验

热门文章

  1. ORACLE常用的一些特殊SQL,收藏收藏,下次需要的时候就不用再翻箱倒柜了
  2. Silverlight 2.5D RPG游戏技巧与特“.NET技术”效处理:(十一)AI系统
  3. Deteming the User Intent of Web Search Engine
  4. php怎么实现弹幕,HTML如何利用canvas实现弹幕功能
  5. HTML基本语法九 会移动的文字
  6. 2019-07-10
  7. FPGA外设操作指南1: 8/16位PWM控制器
  8. 银行对公业务结构图梳理
  9. Grafana全面瓦解
  10. curl返回常见错误码