ASP.NET MVC的路由机制:命名路由

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

命名路由:

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的路由时会可能产生二义性。但给路由命名却可以解决这个问题。

查看本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/webkf/aspx/

下面我们注册两个路由:

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=123})
@Html.RouteLink("Default",new{controller="Home",action="Index",id=123})

这里注意:上面两个方法并不能确定使用哪个路由来生成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=123})
@Html.RouteLink(
    linkText:"Default",
    routeName:"Default",
    routeValues:new {controller="Home",action="index",id=123})

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索url
, action
, controller
, 路由
, index
, 123 net
, 生成
, 生成url
, URL不能被Routes匹配
, url路由
, 匹配URL
, url生成
, 路由机制
生成机制
,以便于您获取更多的相关知识。

时间: 2024-12-28 16:44:51

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

ASP.NET MVC 5 入门教程 (3) 路由route

原文:ASP.NET MVC 5 入门教程 (3) 路由route 文章来源: Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc-5-get-started-route.html 上一节:ASP.NET MVC 5 入门教程 (2) 控制器Controller 下一节:ASP.NET MVC 5 入门教程 (4) View和ViewBag 源码下载:点我下载 上一节我们讲了如何创建一个控制器,本节我们来讨论如何通过路由来访问控制器及其Action.

通过扩展改善ASP.NET MVC的验证机制[使用篇]

原文:通过扩展改善ASP.NET MVC的验证机制[使用篇] ASP.NET MVC提供一种基于元数据的验证方式是我们可以将相应的验证特性应用到作为Model实体的类型或者属性/字段上,但是这依然具有很多的不足.在这篇文章中,我结合EntLib的VAB(Validation Application Block)的一些思想通过扩展为ASP.NET MVC提供一种更为完善的验证机制.[源代码从这里下载] 目录: 一.扩展旨在解决怎样的验证问题 二.一个简单的消息维护组件 三.多语言的支持 四.基于某

ASP.NET MVC的运行机制

一.ASP.NET + MVC IIS与ASP.NET管道 MVC.MVP以及Model2[上篇] MVC.MVP以及Model2[下篇] ASP.NET MVC是如何运行的[1]: 建立在"伪"MVC框架上的Web应用 ASP.NET MVC是如何运行的[2]: URL路由 ASP.NET MVC是如何运行的[3]: Controller的激活 ASP.NET MVC是如何运行的[4]: Action的执行 二.URL 路由 ASP.NET的路由系统:URL与物理文件的分离 ASP.

Asp.Net Mvc: Model Binding 机制分析

环境: Windows 2008, VS 2008 SP1, Asp.Net Mvc RC1 请求过程片段: 在请求的Action被调用之前,ControllerActionInvoker.InvokeAction()方法被调用,在这个方法里 面,有一个ReflectedActionDescriptor的实例会被构建,这个实例包含Action的描述信息. 接着,ControllerActionInvoker.GetParameterValues()方法被调用,通过传入的之前创建的 Reflect

通过扩展改善ASP.NET MVC的验证机制[实现篇]

在<使用篇>中我们谈到扩展的验证编程方式,并且演示了本解决方案的三大特性:消息提供机制的分离.多语言的支持和多验证规则的支持,我们现在来看看这样的验证解决方案最终是如何实现的. 目录: 一.为验证创建一个上下文:ValidatorContext 二.通过自定义ActionInvoker在进行操作执行之前初始化上下文 三.为Validator创建基类:ValidatorBaseAttribute 四.通过自定义ModelValidatorProvider在验证之前将不匹配Validator移除

Asp.Net Mvc: 浅析TempData机制

环境: Windows 2008, VS 2008 SP1, Asp.Net Mvc 1.0 一. Asp.Net Mvc中的TempData 在Asp.Net Mvc框架的ControllerBase中存在一个叫做TempData的Property,它的类型为 TempDataDictionary,顾名思义是一个字典类.TempData在Asp.Net Mvc中的作用是:可用于在Action执 行过程之间传值.简单的说,你可以在执行某个Action的时候,将数据存放在TempData中,那么在

给ASP.NET MVC及WebApi添加路由优先级(1)

一.为什么需要路由优先级 大家都知道我们在Asp.Net MVC项目或WebApi项目中注册路由是没有优先级的,当项目比较大.或有多个区域.或多个Web项目.或采用插件式框架开发时,我们的路由注册很可能 不是写在一个文件中的,而是分散在很多不同项目的文件中,这样一来,路由的优先级的问题就突显出来了. 比如: App_Start/RouteConfig.cs中 routes.MapRoute(      name: "Default",      url: "{controll

给ASP.NET MVC及WebApi添加路由优先级

一.为什么需要路由优先级 大家都知道我们在Asp.Net MVC项目或WebApi项目中注册路由是没有优先级的,当项目比较大.或有多个区域.或多个Web项目.或采用插件式框架开发时,我们的路由注册很可能 不是写在一个文件中的,而是分散在很多不同项目的文件中,这样一来,路由的优先级的问题就突显出来了. 比如: App_Start/RouteConfig.cs中 routes.MapRoute(      name: "Default",      url: "{controll

为ASP.NET MVC及WebApi添加路由优先级_实用技巧

一.为什么需要路由优先级 大家都知道我们在Asp.Net MVC项目或WebApi项目中注册路由是没有优先级的,当项目比较大.或有多个区域.或多个Web项目.或采用插件式框架开发时,我们的路由注册很可能 不是写在一个文件中的,而是分散在很多不同项目的文件中,这样一来,路由的优先级的问题就突显出来了. 比如: App_Start/RouteConfig.cs中 routes.MapRoute( name: "Default", url: "{controller}/{actio

ASP.NET MVC案例教程(基于ASP.NET MVC beta)—第三篇:ASP.NET MVC全局观

前言 在上一篇文章中,我们实现了第一个ASP.NET MVC页面.对于没有接触过这个框架的朋友来说,可能对有些地方会迷惑,所以这 篇文章我将通过图示配合文字的方法,站在全局的角度介绍一些ASP.NET MVC的运行机制,这样可以帮助朋友们更好的理解后续文章. ^_^ 全局 首先我们来看一副图片,由于这幅图是我自己画的,不是摘自微软官方,所以如果有什么不到位的地方还望海涵! 首先,用户通过Web浏览器向服务器发送一条 url请求,这里请求的url不再是xxx.aspx格式,而是http://Hos