框架自动生成的路由配置

上图中,路由配置文件为App_Start文件夹下的RouteConfig.cs。

代码如下:

public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}

注意:路由中的控制器和操作不区分大小写。

忽略路由

IgnoreRoute为RouteCollection 的扩展方法,作用是忽略指定样式的路由。

上面routes.IgnoreRoute("{resource}.axd/{*pathInfo}");中的{resource}代表一个路由参数,{resource}.axd代表以.axd结尾的字符串;{*pathInfo}也是一个路由参数,*代表匹配任何字符串,那么以pathInfo结尾的串都会匹配到。这条语句完整含义是:以axd结尾的任何字符串,不论斜杠后是何种字符串都不执行路由行为。

映射路由

MapRoute也是RouteCollection 的扩展方法,映射路由。

MapRoute有多个重载的方法,所有的参数含义如下:

参数名称

参数类型

注释

name

string

路由名称

url

string

Url模式

defaults

object

默认路由值对象

constraints

object

一组表达式,限定URL参数值

namespaces

string[]

设置一组命名空间

参数解析

1)defaults设置默认的路由值对象,

2)constraints:通过正则表达式来设置约束条件

如constraints:new {id=@"\d+"}限制id只能是数值类型

规则:从前到后逐段匹配,请求URL参数少于定义的URL时,默认配置补全对应的参数。

几个例子:

routes.MapRoute(

name:"",

url:"V1/{controller}/{action}/{id}",

defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },

constraints:new {id=@"\d+"}

);

3)url

{controller}/{action}/{id}

这种形式包括了三段,段指的是路由中用/隔开的部分。约定路由中的控制器和操作用controller和action表达。

段也可以包含字面值。

不允许有两个连续的段值:

例如

不允许:{controller}{action}/{id}

合法的:{language}-{current}/{controller}/{action}/{id}

 

多个路由的选择问题

当配置多个路由时,从上到下依次匹配,直至匹配到一个。

匹配现有文件

通过设置RouteCollection.RouteExistingFiles属性来确定是否可以匹配到现有文件。若,routes.RouteExistingFiles = false;则,禁止匹配到现有文件,只能匹配路由表里的虚拟路由。

例:

public static void RegisterRoutes(RouteCollection routes)

{

routes.RouteExistingFiles = true;

//其他配置

}

使用特性配置路由

将属性RouteAttribute 标记到控制器或控制器操作上。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = false, AllowMultiple = true)]

public sealed class RouteAttribute : Attribute, IDirectRouteFactory, IRouteInfoProvider

使用特性的三个属性或构造函数:

public RouteAttribute(string template):template是路由匹配模式

Name:获取或设置路由名称

Order:获取或设置路由应用顺序

Template:获取路由匹配模式

URL与搜索引擎优化

1)URL越短越好

2)用破折号而不是下划线

3)使用小写字母。根据HTTP规范,URL区分大小写,一般的搜索引擎遵循HTTP规范。

使用Glimpse观察路由

安装Glimpse

地址http://getglimpse.com/Docs/#download找到所需安装命令。在网站上可以看到不只应用于MVC;这里主要是使用这个工具观察路由,所以下载MVC包。

打开VS->工具->NuGet程序包管理器->程序包管理器控制台,在控制台上输入命令:Install-Package Glimpse.MVC5,然后回车,执行安装,结果如下:

启用Glimpse

运行web应用,输入地址格式为:网站根目录/glimpse.axd,例如

http://localhost:51881/glimpse.axd,显示界面如下,点击Turn Glimpse on启动。

使用Glimpse观察

启动了Glimpse以后,输入http://localhost:51881/Home/Contact,看到下图

注意浏览器下方多了一条统计信息,从这里可以看到路由请求的相关信息,以上面输入的地址为例:

浏览器请求耗时

服务端响应耗时

点击下面的图标查看更加详细的信息

展示详细信息的界面如下所示:

从上图中可以看到配置,运行环境,模型绑定,请求,路由,服务器,时间统计等等。

扩展路由-创建自定义路由约束

继承IRouteConstraint接口,实现Match方法

public class CustomRouteConstraint : IRouteConstraint
{
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
//实现验证 //验证通过返回true
return true;
}
}

使用约束

routes.MapRoute(
name:"CustomConstr",
url:"{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
constraints:new {id=new CustomRouteConstraint()}
);

原理

1)首先,UrlRouteModule处理新请求,将请求URL映射到定义的路由器上。

2)若URL匹配到已定义的路由,那么创建IRouteHandler实例(默认实例为MvcRouteHandler对象)。

3)IRouteHandler返回HTTP处理器实例(默认的为MvcHandler),HTTP处理器实例负责处理请求消息。

4)HTTP处理器实例使用IControllerFactory(控制器工厂)创建对应的控制器对象。

注意:

对于1)如果请求的URL能够匹配到网站根目录下的实体文件,那么不会再匹配虚拟路由,除非通过RouteCollection.RouteExistingFiles来设置改变这一行为。

参考:

1.Jess Chadwick/Todd Snyder/Hrusikesh Panda,徐雷/徐扬

译。ASP.NET MVC4 Web编程

2.Jon Galloway/Phil Haack/Brad Wilson/K. Scott Allen,孙远帅/邹权译  ASP.NET MVC4 高级编程(第四版)

3.黄保翕,ASP.NET MVC4开发指南

4.蒋金楠,ASP.NET MVC4框架揭秘

5.https://www.asp.net/mvc

转载与引用请注明出处。

时间仓促,水平有限,如有不当之处,欢迎指正。

ASP.NET MVC编程——路由的更多相关文章

  1. ASP.NET MVC 编程参考

    ASP.NET MVC 编程参考   转载请注明出处:http://surfsky.cnblogs.com MVC    参考 http://msdn.microsoft.com/zh-cn/dd40 ...

  2. ASP.NET MVC 自定义路由中几个需要注意的小细节

    本文主要记录在ASP.NET MVC自定义路由时,一个需要注意的参数设置小细节. 举例来说,就是在访问 http://localhost/Home/About/arg1/arg2/arg3 这样的自定 ...

  3. 理解ASP.NET MVC的路由系统

    引言 路由,正如其名,是决定消息经由何处被传递到何处的过程.也正如网络设备路由器Router一样,ASP.NET MVC框架处理请求URL的方式,同样依赖于一张预定义的路由表.以该路由表为转发依据,请 ...

  4. 返璞归真 asp.net mvc (2) - 路由(System.Web.Routing)

    原文:返璞归真 asp.net mvc (2) - 路由(System.Web.Routing) [索引页] [源码下载] 返璞归真 asp.net mvc (2) - 路由(System.Web.R ...

  5. asp.net mvc 特性路由(MapMvcAttributeRoutes)的应用

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012835032/article/details/51160824asp.net mvc 特性路由 ...

  6. ASP.NET MVC编程——视图

    1Razon语法 使用@符号后接C#或VB.NET语句的方式. 基本规则 1)变量 @后直接变量即可 2)代码块 为使用表达式或多行代码,@后跟大括号将多行代码包括在大括号中 3)"+&qu ...

  7. ASP.NET MVC编程——控制器

    每一个请求都会经过控制器处理,控制器中的每个方法被称为控制器操作,它处理具体的请求. 1操作输入参数 控制器的操作的输入参数可以是内置类型也可以是自定义类型. 2操作返回结果 结果类型 调用方法 备注 ...

  8. ASP.NET MVC编程——验证、授权与安全

    1 验证  一般采用表单验证完成登陆验证,建议结合SSL使用.为限制控制器只能执行HTTPS,使用RequireHttpsAttribute 2 授权 对账户的权限的控制可以通过在控制器或控制器操作上 ...

  9. ASP.NET MVC编程——错误处理与日记

    ASP.NET MVC的错误处理应考虑到这几个方面:模型绑定期间发生的错误,未能路由到指定操作,针对控制器的错误处理.使用配置文件可以帮助我们处理异常,但是不够灵活和全面:使用HandleErrorA ...

随机推荐

  1. Java Singleton(单例模式) 实现详解

    什么是单例模式? Intend:Ensure a class only has one instance, and provide a global point of access to it. 目标 ...

  2. Mysql最左匹配原则实践(原创)

    mysql最左匹配原则 什么叫最左匹配原则 最左匹配原则的误区 实战 结论: 1 条件查询中条件顺序没有关系 2 在最左匹配原则中,有如下说明: 最左前缀匹配原则,非常重要的原则,mysql会一直向右 ...

  3. c#无边窗体实现移动的两种方式

    转载:http://blog.csdn.net/dxsh126/article/details/2940226 首先,要用到一个WimdowsAPI函数,因此必须引入 using System.Run ...

  4. BZOJ1396: 识别子串(后缀自动机 线段树)

    题意 题目链接 Sol 后缀自动机+线段树 还是考虑通过每个前缀的后缀更新答案,首先出现次数只有一次,说明只有\(right\)集合大小为\(1\)的状态能对答案产生影响 设其结束位置为\(t\),代 ...

  5. [AngularJS] “路由”的定义概念、使用详解——AngularJS学习资料教程

    这是小编的一些学习资料,理论上只是为了自己以后学习需要的,但是还是需要认真对待的 以下内容仅供参考,请慎重使用学习 AngularJS“路由”的定义概念 AngularJS最近真的很火,很多同事啊同学 ...

  6. js移动终端浏览器版本

    //当要在不同移动终端浏览器中运行不同的代码时,需要对各个终端浏览器进行判断 //判断浏览器 var browser = { versions: function () { var u = navig ...

  7. frame shiro 认证示例及原理简述

    shiro 认证流程 1.创建一个 javaSE 的maven项目(quickstart),并添加依赖 <dependency> <groupId>junit</grou ...

  8. zabbix使用问题

    1中文乱码 https://www.linuxidc.com/Linux/2017-08/146162.htm 软件 说明 备注 zabbix 3.4.7 操作系统 Centos7 问题描述:图表内容 ...

  9. leetCode题解之寻找string中最后一个word的长度

    1.题目描述 返回一个 string中最后一个单词的长度.单词定义为没有空格的连续的字符,比如 ‘a’,'akkk'. 2.问题分析 从后向前扫描,如果string是以空格‘  ’结尾的,就不用计数, ...

  10. 从Azure上构建Windows应用程序映像

    从Azure上构建windows应用程序映像同构建Linux应用程序映像总体流程比较类似,可以参考上图Linux映像的制作发布等流程,具体细节又有所差别. 具体步骤如下: 从Azure管理平台上申请W ...