ASP.NET MVC编程——路由

框架自动生成的路由配置

上图中,路由配置文件为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

-----------------------------------------------------------------------------------------

转载与引用请注明出处。

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏谈补锅

ios线程和GCD和队列同步异步的关系

  进程是指在系统中正在运行的一个应用程序。比如同时打开QQ、Xcode,系统就会分别启动2个进程。截图

64540
来自专栏逸鹏说道

在 ASP.NET MVC 中使用异步控制器

可以通过 AsyncController 类编写异步操作方法。 可以对长时间运行的、非 CPU 绑定的请求使用异步操作方法。 这样可避免在处理请求时阻塞 Web...

375110
来自专栏飞雪无情的博客

Go语言中间件框架 Negroni 的静态文件处理源码分析

Negroni是一个非常棒的中间件,尤其是其中间件调用链优雅的设计,以及对GO HTTP 原生处理器的兼容。我以前写过两篇文章,对Negroni进行了专门的分析...

12330
来自专栏草根专栏

测试 ASP.NET Core API Controller

本文需要您了解ASP.NET Core MVC/Web API, xUnit以及Moq相关知识.

14340
来自专栏Danny的专栏

数据库中存储日期的字段类型到底应该用varchar还是datetime ?

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

1.4K30
来自专栏张善友的专栏

Contact Manager Web API 示例[2] Web API Routing

联系人管理器web API是一个Asp.net web api示例程序,演示了通过ASP.NET Web API 公开联系信息,并允许您添加和删除联系人,示例地...

20360
来自专栏技术小黑屋

Ruby常用文件操作

初学Ruby,很多需要学习,现在开始尝试使用Ruby来写一个脚本,其中用到了很多文件相关的操作,这里阶段地整理一些。便于后续的再次查找。

8420
来自专栏大内老A

ASP.NET Web API自身对CORS的支持: CORS授权检验的实施

通过《EnableCorsAttribute特性背后的故事》我们知道:由CorsPolicyProvider提供的CorsPolicy表示目标Action采用的...

206100
来自专栏大内老A

[WCF权限控制]模拟(Impersonation)与委托(Delegation)[上篇]

由于服务操作是在寄宿进程中执行,在默认的情况下,服务操作是否具有足够的权限访问某个资源(比如文件)决定于执行寄宿进程Windows帐号的权限设置,而与作为客户端...

27160
来自专栏炉边夜话

JNI使用技巧点滴(二)

作者:normalnotebook 背景<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com...

18420

扫码关注云+社区

领取腾讯云代金券