• 理解ASP.NET MVC系列之三:从URL到Route


    这一篇继续从请求说起。

    有意义的URL

    在经典的Web From请求中,通常我们请求的都是.aspx或者.ashx的文件。

    ASP.NET MVC中,此时的请求不同了。

    MVC的请求是一个有意义的URL,虽然不是直接请求的文件,但它还是能够得到网站应用程序处理,还是能得到响应,这是为什么呢?上一节也提过了,那就是Route在中间做了处理。

     

    Route:

    ASP.NET MVC中,从URLRouteData的映射通过Route对象表示。就是说请求参数在RouteTable中进行匹配,然后返回一个匹配的Route对象RouteData。所以需要先在RouteTable中注册Route信息(这一步在Global.asax.cs中进行), RouteTable的静态属性Routes保存当前应用程序的所有Route信息。

     

    这里需要注意的是,在往RouteTable中添加Route的时候,顺序很重要,因为应用程序在匹配Route的时候,会从上往下依次进行查找,所以特殊的应该放到前边,一般化的放到后边,不然,你的特殊的URL永远被一般化的Route抢先匹配,特殊的Route永远匹配不到了。

     

    所有的Route都必须派生自RouteBase类。

    此类的定义如下:

    此类有一个构造函数和两个方法:

    GetRouteData方法需要一个HttpContextBase类型的参数,这个参数包含了封装好的有关HTTP请求信息的对象。根据传进来的请求信息对象进行匹配,如果该路由与当前请求匹配,就会返回一个包含路由定义值的对象,否则返回null

    GetVirtualPath方法需要两个参数,requestContext参数是封装了有关请求的路由的信息的一个对象,values参数包含了路由参数的对象。如果当前路由跟values匹配,它会返回一个包含了生成的URL和有关路由信息的对象。否则返回null

     

    自定义路由:

    MVC中,我们通常在URL中包含需要使用的控制器名称和控制器中执行的动作,然后还得在后边附加上动作所需的参数。在ASP.NET MVC中提供了一个默认的路由格式供我们使用。

     

    不过如果参数有2个或者更多的时候,如果使用默认的URL格式,这个URL可能是这个样子的:http://www.petshop.com/petshop/search/fish/meno

    www.petshop.com表示网站

    petshop表示Controller

    search表示执行的动作。

    fishmeno是两个参数,表示要查看fish类别下的meno

    不过这个地址有些太冗长了。

     

    如果我们想直接输入参数,而默认使用petshop控制器和search动作呢?像这个样子:

    http://www.petshop.com /fish/meno

    那我们就需要自定义一个路由了:

     

    这个路由通过默认的参数来指定了ControllerAction

     

    路由约束:

    可是上边的Route定义之后,会发现原来有效的Home/Index出现了问题。上边定义的Route只需要两个参数,可是Home/Index也是两个参数,所以,两个参数的请求都被路由到PetShopsRoute上来了。

    我们定义PetShopsRoute仅仅是为了处理petshop的类别,Home/Index这个请求我们是不希望被PetShopRoute路由的,所以我们就可以限制Categories参数必须是我们所希望的。

    我们可以修改上边的PetShopRoute路由为:

     

     

     

    自定义路由约束:

    要实现自定义路由约束就要实现 IRouteConstraint 接口。此接口的定义为:

     

    此类只包含了一个方法:Match,如果URL参数包含有效值就会返回true,否则返回false。此方法需要5个参数。

    httpContext:封装了有关HTTP请求信息的对象;

    route:此约束所属的对象。

    parameterName:正在检测的参数的名称;

    values:一个包含URL的参数的对象:

    routeDirection:这个对象只是在处理传入请求或者生成URL时,是否正在执行的约束检查。

     

    关于自定义路由的实例,龙王有一篇文章ASP.NET MVC 之创建自定义路由约束,说得很清晰,推荐大家去看一下。这里我就不再重复了。

    好了,这篇就到这里,关于请求的执行过程说完了。

    待续。

  • 相关阅读:
    sql server 去掉重复项
    mvc2.0与3.0 便利一行三个元素 便利多行代码
    新距离
    Android
    Java
    计算机文化基础期末考试复习
    立体的导航条
    腾讯微博
    1637
    私有变量
  • 原文地址:https://www.cnblogs.com/sirkevin/p/2150456.html
Copyright © 2020-2023  润新知