zoukankan      html  css  js  c++  java
  • 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

    转载与引用请注明出处。
    
    时间仓促,水平有限,如有不当之处,欢迎指正。
  • 相关阅读:
    两数交换
    排序算法总结
    mysql 完整性约束
    mysql 数据类型
    python 学习_第四模块 并发编程(多线程)
    python 学习_第四模块 并发编程(多进程)
    第二章 mysql用户管理
    第一章 mysql源码安装
    python 学习_第三模块网络编程入门
    python 学习_第三模块 面向对象(中级)
  • 原文地址:https://www.cnblogs.com/hdwgxz/p/8640648.html
Copyright © 2011-2022 走看看