最近一直在学习mvc,其中对于 Url.Action生成的url感到很困惑。官方的解释的基于路由方案生成的url。问题是,怎样基于,怎样选择,没有过多的解释。网上找了很多资料,也看不懂,最后还是在pro asp.net mvc3 framework这本书看明白了。

我的路由方案是这样的

  public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute
(
null,
"",
new { controller = "Product", action = "List", category = (string)null, page = },
new { page = @"\d+" }
); routes.MapRoute
(
null,
"Page{page}",
new { controller = "Product", action = "List", category = (string)null },
new { page = @"\d+" }
); routes.MapRoute
(
null,
"{category}",
new { controller = "Product", action = "List", page = } ); routes.MapRoute
(
null,
"{category}/Page{page}",
new { controller = "Product", action = "List" },
new { page = @"\d+" }
); routes.MapRoute(
name: null,
url: "{controller}/{action}/{id}",
defaults: new { controller = "Product", action = "List", id = UrlParameter.Optional }
); }

路由方案

这是我需要输出的设置

 <div class="pager">
@Html.PagingLinks(Model.pagingInfo, x => Url.Action("List", new { controller = "Product", action= "List", category = Model.CurrentCategory, page = x }))
</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不是以最佳路由生成,而是以最先找到生成,例如:

 routes.MapRoute(
name: "fist",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Product", action = "List", id = UrlParameter.Optional }
);
routes.MapRoute
(
"second",
"{category}/Page{page}",
new { controller = "Product", action = "List" },
new { page = @"\d+" }
);

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

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

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

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

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

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

第一次写博客请见谅哈。

mvc 生成输出url的更多相关文章

  1. 生成输出url时,使用CSS来控制超链接的格式

    在前文<生成输出url>中的第5点,介绍了使用ActionLink生成输出url中指定html标签属性. 例如, 假设Global.asax中的路由定义为: public static v ...

  2. 生成输出 URL(16.2)

    1.在视图中生成输出 URL 几乎在每一个 MVC 框架应用程序中,你都会希望让用户能够从一个视图导航到另一个视图 —— 通常的做法是在第一个视图中生成一个指向第二个视图的链接,该链接以第二个视图的动 ...

  3. 生成输出url

    继续使用前面的例子11-3URLTestDemo,修改Global.asax中的RegisterRoutes方法如下: public static void RegisterRoutes(RouteC ...

  4. 生成链接中的全限定URL(Generating Fully Qualified URLs in Links) | 在视图中生成输出URL | 高级路由特性

    结果:<a class="myCSSClass"href="https://myserver.mydomain.com/Home/Index/MyId#myFrag ...

  5. 指定HTML标签属性 |Specifying HTML Attributes| 在视图中生成输出URL |高级路由特性 | 精通ASP-NET-MVC-5-弗瑞曼

    结果呢: <a class="myCSSClass" href="/" id="myAnchorID">This is an o ...

  6. 传递额外的值 Passing Extra Values |在视图中生成输出URL | 高级路由特性 | 精通ASP-NET-MVC-5-弗瑞曼

    结果呢 <a href="/App/DoCustomVariable?id=Hello">This is an outgoing URL</a> 理解片段变 ...

  7. 用路由系统生成输出URL 在视图中生成输出URL 高级路由特性 精通ASP-NET-MVC-5-弗瑞曼

    Using the Routing System to Generate an Outgoing URL 结果呢:<a href="/Home/CustomVariable" ...

  8. 根据指定路由生成URL |Generating a URL from a Specific Route | 在视图中生成输出URL|高级路由特性

    后面Length=5 是怎么出现的?

  9. 在动作方法中生成输出URL (Generating Outgoing URLs in Action Methods) |

随机推荐

  1. 「Githug」Git 游戏通关流程

    Githug 他喵的这是个啥!?难道不是 GitHub 拼错了么,和 Git 什么关系? 和游戏又有什么关系? 其实,他的元身在这里:https://github.com/Gazler/githug  ...

  2. base64编码问题 需要对每个参数URL编码

    - (NSString *)encodeToPercentEscapeString: (NSString *) input { // Encode all the reserved character ...

  3. Android笔记之 文件保存、压缩与清空删除

    这两天改进优化项目中图片上传的代码.考虑到可能有7.8M的比較大的图片,由于要先进行压缩.所以设计到文件的压缩,保存与清空删除操作. 在这里记下笔记. /** * 压缩并另存为,每次先清空再保存 */ ...

  4. Arduino 数码管LED屏驱动

    今天測试数码管LED屏驱动,用某产品的一个共阴极的LED屏,依据电路图做数码管LED屏的检測. 代码写得有些冗长,有好几种驱动的方法,这里仅仅是当中一种最直接的方案,抽出时间要做个更有效率的调用和驱动 ...

  5. Unity3D Asset stored 已下载的位置

    Unity3D Asset stored下载资源在本地的什么目录里呢?C:\Users\accountName\AppData\Roaming\Unity\Asset Store

  6. GSON 简介 示例

    Gson简介 目前解析json最常用的三种工具:org.json(Java常用的解析),fastjson(阿里巴巴出的),Gson(Google出的),解析速度最快的是Gson. Gson的全名为Go ...

  7. Java多线程——线程同步

    在之前,已经学习到了线程的创建和状态控制,但是每个线程之间几乎都没有什么太大的联系.可是有的时候,可能存在多个线程多同一个数据进行操作,这样,可能就会引用各种奇怪的问题.现在就来学习多线程对数据访问的 ...

  8. POJ3750

    #include <iostream> #include <stdio.h> #include <cstring> using namespace std; int ...

  9. css3 3D变换和动画

    3D变换和动画 建立3D空间,transform-style: preserve-3d perspective: 100px; 景深 perspective-origin:center center ...

  10. C#判断程序是否以管理员身份运行,否则以管理员身份重新打开

    /// <summary> /// 判断程序是否是以管理员身份运行. /// </summary> public static bool IsRunAsAdmin() { Wi ...