• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

这一篇继续从请求说起。

有意义的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 之创建自定义路由约束,说得很清晰,推荐大家去看一下。这里我就不再重复了。

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

待续。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
ASP.NET后台怎么输出方法中间调试信息?发布时间:2022-07-10
下一篇:
ASP.NETAJAX应用发布时间:2022-07-10
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap