• ASP.NET MVC路由


     ASP.NET MVC路由(二)

    前言

    在上一篇中,提及了Route、RouteCollection对象的一些信息,以及它们的结构所对应的关系。按照处理流程走下来还有遗留的疑问没有解决这个篇幅就来讲解一下。

    URL规则的生成

    Url规则看名字挺吓唬人的,其实就是根据我们自定义的Url来解析出一个模式,然后等待请求的Url来的时候,跟我们定义的模式进行匹配(如下图)。这是后续的内容。

    在上篇中说到URL规则的定义是在Route对象中的,下面来讲解在Route对象中怎么根据用户注册的URL转变成URL规则。

    还是用前面的示例来演示,在前篇中说道,在MapRoute方法中的”{control}/{action}/{id}”参数部分代表着要赋值到Route对象的Url属性,也说过在赋值Route对象的Url属性时Set访问器还会做一些其它的操作。例如代码1-1:

    代码1-1

    复制代码
     1         public class Route
     2         {
     3             private string _url;
     4             private ParsedRoute _parsedRoute;
     5             public string Url
     6             {
     7                 get { return _url; }
     8                 set
     9                 {
    10                     _url = value;
    11                     //解析Value值
    12                     this._parsedRoute = RouteParser.Parse(value);
    13                 }
    14             }
    15             ……
    16         }
    复制代码

    这里只是显示了Route对象的一部分用于演示,在代码1-1中,可以看出RouteParser类型负责把接收到的Url值转换成ParsedRoute类型的对象。

    这个ParsedRoute类型的对象是Route类型的内部私有类型,而转换而成的Url模式信息就存放在这个类型的对象实例中。请看图1:

    图1

    图1所示,当一个Url值为”{controller}/{action}”赋值到Route对象的Url属性时,会由RouteParser内部类型的Parse()静态方法来执行Url解析并且转换成ParsedRoute内部类型,而ParsedRoute类型的构造函数是由PathSegment类型的集合构成。而在MVC框架中并不是使用PathSegment类型的,而是使用PathSegment类型的的派生类(如图2),并且这些派生类分别对应着不同的Url片段,就好比示例的”{controller}/{action}”就会分别的表示为两种类型(下面会讲到)。

    图2

    正如图2所示的对象模型,按照图2的模型结构。这个时候ParsedRoute内部所存的Url模式值为图3所示,

    图3

    如图3所示上述示例中的“controller”生成为ContentPathSegment类型,而“/”则被生成为SeparatorPathSegment类型。对于这些类型的具体细节这里就不做详细的介绍了。目的在于只是把内部的实现粗略的把对象模型说明一下,目的就是让大家知道有这么一个过程来生成URL规则,并且是什么样的一个实现的方式,让大家知道Route对象的本身就是带有URL规则的,在服务器请求到来的时候是众多Route对象根据自身携带的URL规则来进行匹配,这部分内容后续说到。

    如果感兴趣想清晰的知道内部实现的具体,可以自己用反编译工具来看里面的源代码,这部分的Url规则的生成过程就讲到这里。

    希望看完后大家能够记住大概的流程和这些对象在系统中的位置。会在下一篇幅讲解RouteData的是怎么根据请求的Url来匹配生成的。

     

    作者:金源

    出处:http://www.cnblogs.com/jin-yuan/

  • 相关阅读:
    三分钟学会.NET微服务之Polly
    redis设置密码和redis主从复制
    程序员工作之外,如何再赚一份工资?
    吞吐量(TPS)、QPS、并发数、响应时间(RT)概念
    TPS和QPS的区别和理解
    制定一套适合自己团队的GITflow标准化工作流
    UvaLive 6600 Spanning trees in a secure lock pattern 矩阵行列式
    从零開始学Xamarin.Forms(一) 概述
    Unity 之 C# 利用回调函数实现C++匿名函数
    hdu 4324 Triangle LOVE(拓扑判环)
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3771300.html
Copyright © 2020-2023  润新知