首先看一下命名路由和没有命名的差别:

命名路由:

  routes.MapRoute(
name: "Test", // Route name
url: "code/p/{action}/{id}", // URL with parameters
defaults: new { controller = "Section", action = "Index", id = UrlParameter.Optional } // Parameter defaults
);

默认路由:

routes.MapRoute(
Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults

ASP.NET 中的路由机制没有要求路由具有名称,而且大多数情况下没有名称的路由也能满足大多数应用场合。通常情况下,为了生成一个URL(统一资源定位符),只需要抓取事先已经定义好的路由值,并把他们交给路由引擎,剩下的就有路由引擎来处理,正如我们要介绍的,在有些情况下,使用这种方法在选择生成URL的路由时会可能产生二义性。但给路由命名却可以解决这个问题。

下面我们注册两个路由:

           routes.MapRoute(
name: "Test", // Route name
url: "code/p/{action}/{id}", // URL with parameters
defaults: new { controller = "Section", action = "Index", id = UrlParameter.Optional }
);
routes.MapRoute(
name:"Default", // Route name
url:"{controller}/{action}/{id}", // URL with parameters
defaults:new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

为了在视图中生成一个指向每个路由的超链接,我们在Home下面的Index页面上加入下面代码

@Html.RouteLink("Test",new{controller="Section",action="Index",id=})
@Html.RouteLink("Default",new{controller="Home",action="Index",id=})

这里注意:上面两个方法并不能确定使用哪个路由来生成URL,他们只提供了一些路由值,正如所期望的,第一个方法生成指向/code/p/Index/123的URL,第二个方法生成指向/Home/Index/123的URL.

对于上面的这些简单实例而言,生成URL非常简单,但是有些情形还是会令我们头疼。

假设我们在路由列表的开始部分加入如下的页面路由,为了使/aspx/Page.aspx/页面处理/static/url

        routes.MapPageRoute(
"new",
"static/url",
"~/aspx/SomePage.aspx"
);

注意我们在实验中不能将这个路由放在路由列表的末尾,否则他不能匹配传入的请求,我们就看不到我们想要的效果。为什么会这样呢?因为默认路由会在他之前与我们前面的那两个路由匹配,因此我们要把该路由放到路由列表的开始部分。

那么将上面的路由放到路由列表的开始位置会有说明变化呢?对于传入的请求而言,该路由只能匹配URL为/static/url的请求,而不匹配任何其它的请求,这也正是我们想要的。我们看一下我们点击上面两个超链接返回的URL都是不可用的:

/static/url?controller=Section&action=Index&id=123

/static/url?controller=Home&action=Index&id=123

通常情况下,当使用路由机制生成URL时,我们提供的路由值被用来填充URL参数,但是我们可以看到上面这个路由根本没有URL参数("/static/url"),因此他可以匹配每一个可能生成的URL,也就是我们上面两个链接都匹配了这个路由,所以生成了没有用的URL。

这时我们可以指定路由名称,不仅可以避免二义性,甚至在某种程度上提高性能,因为路由引擎可以直接定位到指定的路由,并尝试用它来生成URL。

在前面的实例中,我们生成了两个链接,下面我们做些修改,就可以看到命名路由的优点了(下面的代码使用了命名参数):

@Html.RouteLink(
linkText:"route:test",
routeName:"test",
routeValues:new{controller="section",action="index",id=})
@Html.RouteLink(
linkText:"Default",
routeName:"Default",
routeValues:new {controller="Home",action="index",id=})

这样我们就可以正确找到路由了."人们的名字是他们命运的缩写"。这句话同样使用与生成URL的路由。

【ASP.NET MVC】 路由机制:命名路由的更多相关文章

  1. Asp.Net MVC 进阶篇:路由匹配 实现博客路径 和文章路径

    Asp.Net MVC 进阶篇:路由匹配 实现博客路径 和文章路径 我们要实现 通过路由 匹配出 博客地址 和博客文章地址 例如下面的这两个地址 //http://www.cnblogs.com/ma ...

  2. 【图解ASP.NET MVC运行机制理解-简易版】

    很多盆友咨询ASP.NET MVC的机制.网上也有好多.但是都是相当深奥.看的云里雾里的.我今天抽空,整理个简易版本.把处理流程走一遍. 当然,这个只是处理请求的一部分环节.百度的面试题“客户端从浏览 ...

  3. 白话ASP.NET MVC之一:Url 路由

    好久没有写关于ASP.NET MVC的东西了,虽然<ASP.NET MVC4框架揭秘>已经完完整整的看完一遍,但是感觉和一锅粥差不多,没什么可写的,因为我自己不理解,也就写不出来.现在开始 ...

  4. 给Asp.Net MVC及WebApi添加路由优先级

    一.为什么需要路由优先级 大家都知道我们在Asp.Net MVC项目或WebApi项目中注册路由是没有优先级的,当项目比较大.或有多个区域.或多个Web项目.或采用插件式框架开发时,我们的路由注册很可 ...

  5. 转:在ASP.NET MVC中通过URL路由实现对多语言的支持

    对于一个需要支持多语言的Web应用,一个很常见的使用方式就是通过请求地址来控制界面呈现所基于的语言文化,比如我们在表示请求地址的URL中将上语言文化代码(比如en或者en-US)来指导服务器应该采用怎 ...

  6. 【转载】为ASP.NET MVC及WebApi添加路由优先级

    路由方面的: 转载地址:http://www.jb51.net/article/73417.htm Author:lijiao 这是一个对Asp.Net Mvc的一个很小的功能拓展,小项目可能不太需要 ...

  7. Asp.net MVC 基于Area的路由映射

    对于一个较大规模的Web应用,我们可以从功能上通过Area将其划分为较小的单元.每个Area相当于一个独立的子系统,具有一套包含Models.Views和Controller在内的目录结构和配置文件. ...

  8. ASP.NET MVC运行机制源码剖析

    我们都知道ASP.NET首先是从Global.aspx中开始运行的, 在Application_Start()中添加路由映射后, 就由URLRouting组件创建IRouteHandler并执行, 在 ...

  9. Flutter中的普通路由与命名路由(Navigator组件)

    Flutter 中的路由通俗的讲就是页面跳转.在 Flutter 中通过 Navigator 组件管理路由导航.并提供了管理堆栈的方法.如:Navigator.push 和 Navigator.pop ...

  10. 关于使用vue-router的嵌套路由的命名路由时踩的坑

    今天在做我的模仿微博项目时,我想实现点击router-link后,跳转到微博正文页面,并渲染其嵌套视图-评论组件.但是在实际实现时,我发现页面可以正常跳转,但是在页面加载后,并不渲染该页面的嵌套视图, ...

随机推荐

  1. 使用VS2010编译MongoDB C++驱动详解

    最近为了解决IM消息记录的高速度写入.多文档类型支持的需求,决定使用MongoDB来解决. 考虑到MongoDB对VS版本要求较高,与我现有的VS版本不兼容,在leveldb.ssdb.redis.h ...

  2. PIP 批量更新改为清华这边的镜像更新

    之前pip批量更新的时候发现有些包无法更新,而且速度也特别慢,今天尝试了下清华的镜像,速度是真快 # coding=utf-8import pipfrom subprocess import call ...

  3. Windows常用shell命令大全(转)

    [Windows常用shell命令大全] 基于鼠标操作的后果就是OS界面外观发生改变, 就得多花学习成本.更主要的是基于界面引导Path与命令行直达速度是难以比拟的.另外Geek很大一部分是键盘控,而 ...

  4. springboot-为内置tomcat设置虚拟目录

    需求 项目使用springboot开发,以jar包方式部署.项目中文件上传均保存到D判断下的upload目录下. 在浏览器中输入http://localhost:8080/upload/logo_1. ...

  5. [SDOI2008]仪仗队 (洛谷P2158)

    洛谷题目链接:[SDOI2008]仪仗队 题目描述 作为体育委员,C君负责这次运动会仪仗队的训练.仪仗队是由学生组成的N * N的方阵,为了保证队伍在行进中整齐划一,C君会跟在仪仗队的左后方,根据其视 ...

  6. [Luogu 1640] SCOI2010 连续攻击游戏

    [Luogu 1640] SCOI2010 连续攻击游戏 DP太恶心,回来二分图这边放松一下心智. 这个建图真的是难以想到. 因为要递增啊,属性值放x部,装备放y部,对应连边跑Hungary就好了. ...

  7. 使用MyBatis查询 返回类型为int,但是当查询结果为空NULL,报异常的解决方法

    使用MyBatis查询 返回类型为int,但是当查询结果为空NULL,会报异常. 例如: <select id="getPersonRecordId" parameterTy ...

  8. 常见XSD问题

    < xs:elementname="status"> < xs:complexType> < xs:sequence> < xs:elem ...

  9. 启动hbase输出ignoring option PermSize=128m; support was removed in 8.0告警信息

    ./start-hbase.sh starting master, logging to /home/hadoop/hbase-1.2.4/bin/../logs/hbase-hadoop-maste ...

  10. Spring的使用优点

    spring事物配置,声明式事务管理和基于@Transactional注解的使用 spring支持编程式事务管理和声明式事务管理两种方式. 编程式事务管理使用TransactionTemplate或者 ...