约束路由

1、用正则表达式约束路由

有工程11-3URLTestDemo,如在Global.asax中有如下路由定义:


        public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}",
new { Controller = "Home", Action = "Index", id = UrlParameter.Optional },
new { Controller="^H.*"},
new[] { "_11_3URLTestDemo.Controllers" });
}

这里的new[] { "_11_3URLTestDemo.Controllers"
}表示优先匹配_11_3URLTestDemo.Controllers命名空间中的控制器,这是为了避免在不同的命名空间中有同名的控制器时出现命名冲突,通过此种方式可以指定匹配的优先顺序。

这里我们关注的是正则表达式来约束路由。约束被表示成一个匿名类型,该类型的属性对应到想要进行约束的片段变量名,例如这里就是Controller,表明后面的正则表达式"^H.*"是用来约束url中对应controller变量的值的。Controller="^H.*"表示只匹配Controller变量的值以"H"打头的url,url本身不区分大小写,这里的H也不区分大小写。

假设有两个控制器,一个是HomeController,另一个是AccountController,两个控制器里都定义有Index方法。那么对于上面的约束,如有url:

~/home 可以匹配

对于url:

~/Account 则不匹配。

=====

需要注意,这里Controller变量的默认值问题。默认值是在约束检查之前运用的。因此,如果请求的url是根目录"~/",Controller的默认值"Home"会被运用,然后才检查约束。但需要注意的是,这并不意味着不再做约束检查,事实上,检查仍然要做,如果通不过检查,url也不会匹配。

例如,将路由定义作如下修改,把Controller的默认值改为了Account:


        public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}",
new { Controller = "Account", Action = "Index", id = UrlParameter.Optional },
new { Controller="^H.*"},
new[] { "_11_3URLTestDemo.Controllers" });
}

这个时候如果请求的url是根目录"~/",就无法匹配。因为默认值Account不能通过约束检查——第一个字母必须是H(不分大小写)。

2、约束到指定值

例如:


        public static void RegisterRoutes(RouteCollection routes)

{
routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}",
new { Controller = "Home", Action = "Index", id = UrlParameter.Optional },
new { Controller="^H.*", Action="^Index$|^About$"},
new[] { "_11_3URLTestDemo.Controllers" });
}

这里定义的路由匹配的url被约束为:Controller变量的值要以H(不分大小写)字母开头,而且Action变量必须是Index或About。

"~/Home/Index"

"~/Home/About"

这两个url可以匹配。

用这种方式可以限制到比较精确的url。

3、约束使用HTTP方法的路由

例如:


        public static void RegisterRoutes(RouteCollection routes)
{
routes.MapRoute("MyRoute", "{controller}/{action}/{id}/{*catchall}",
new { Controller = "Home", Action = "Index", id = UrlParameter.Optional },
new { Controller="^H.*", Action="^Index$|^About$",
httpMethod = new HttpMethodConstraint("GET")},
new[] { "_11_3URLTestDemo.Controllers" });
}

这里定义的路由就限定了只能匹配使用GET方法进行请求的url。

注意这里的名字httpMethod是自己指定的,只要给它赋值为一个HttpMethodConstraint类的实例就可以了。

上面的例子限定了只能使用GET方法,也可以很容易的添加另外的方法:

httpMethod = new HttpMethodConstraint("GET", "POST")

4、单元测试:路由约束

测试路由约束时,最好对所要匹配的url和试图排除的url都进行测试。

例如:


        [TestMethod]
public void TestIncomingRoutes()
{
TestRouteMatch("~/", "Home", "Index");
TestRouteMatch("~/Home", "Home", "Index");
TestRouteMatch("~/Home/Index", "Home", "Index");

TestRouteMatch("~/Home/About", "Home", "About");
TestRouteMatch("~/Home/About/MyId", "Home", "About", new { id="MyId"});
TestRouteMatch("~/Home/About/MyId/More/Segments", "Home", "About",
new { id = "MyId", catchall="More/Segments" });

TestRouteFail("~/Home/OtherAction");
TestRouteFail("~/Account/Index");
TestRouteFail("~/Account/About");
}

也可以测试HTTP方法。

重载TestRouteFail,增添一个参数httpMehod


        private void TestRouteFail(string url, string httpMethod)
{
//布置
RouteCollection routes = new RouteCollection();
MvcApplication.RegisterRoutes(routes);

//动作
RouteData result = routes.GetRouteData(CreateHttpContext(url, httpMethod));

//断言
Assert.IsTrue(result == null || result.Route == null);
}

下面就可以测试对HTTP方法的约束:

        [TestMethod]
public void RegisterRoutesTest()
{
TestRouteMatch("~/", "Home", "Index", null, "get");
TestRouteFail("~/", "POST");
}

约束路由

时间: 2024-10-10 14:48:00

约束路由的相关文章

使用类型和值约束 约束路由

AngularJS路由系列(5)-- UI-Router的路由约束、Resolve属性、路由附加数据、路由进入退出事件

本系列探寻AngularJS的路由机制,在WebStorm下开发.主要包括: ● UI-Router约束路由参数● UI-Router的Resolve属性● UI-Router给路由附加数据● UI-Router的onEnter和onExit事件 AngularJS路由系列包括: 1.AngularJS路由系列(1)--基本路由配置2.AngularJS路由系列(2)--刷新.查看路由,路由事件和URL格式,获取路由参数,路由的Resolve3.AngularJS路由系列(3)-- UI-Rou

MVC路由探寻,涉及路由的惯例、自定义片段变量、约束、生成链接和URL等

引子 在了解MVC路由之前,必须了解的概念是"片段".片段是指除主机名和查询字符串以外的.以"/"分隔的各个部分.比如,在http://site.com/Home/Index中,包含2个片段,第一个片段是Home,第二个片段是Index. URL匹配的特点:● 保守的:URL中的片段数量必须和路由规则中的片段数量一致(路由规则没有设置默认值的前提下)● 宽松的:在满足片段数要求的前提下,URL中的片段内容是宽松的 本篇涉及的方面包括:1.路由惯例2.自定义片段变量3

ASP.NET WebApi 路由配置

一.路由介绍 ASP.NET Web API路由是整个API的入口.我们访问某个资源就是通过路由映射找到对应资源的URL.通过URL来获取资源的. 对于ASP.NET Web API内部实现来讲,我们的请求最终将定位到一个具体的Action上.所以说,ASP.NET Web API路由就是把客户端请求映射到对应的Action上的过程. 二.两种路由模式 2.1 模板路由 模板路由是ASP.NET Web API默认提供的路由.下面我们就简单讲解此中路由的用法. 默认模板路由 模板路由使用前需要定

第13章 URL 路由

在引入MVC框架之前,ASP.NET假设在请求的URL与服务器硬盘上的文件之间有直接的关系. 在MVC情况下,请求是由控制器类中的动作方法处理的. ---------------------------------------------------------- 注:路由系统没有任何控制器和动作的专门知识.它只是片段变量提取值,并把这些值沿着请求管道进行传递.在请求处理管道的 后面部分,当请求恰好到达MVC框架时,其值才会被赋给controller和action变量. 注:默认情况下,路由系统

Asp.Net Web API 2第八课——Web API 2中的属性路由

参考页面: http://www.yuanjiaocheng.net/webapi/web-api-gaisu.html http://www.yuanjiaocheng.net/webapi/create-web-api-proj.html http://www.yuanjiaocheng.net/webapi/test-webapi.html http://www.yuanjiaocheng.net/webapi/web-api-controller.html http://www.yuan

C#进阶系列——WebApi 路由机制剖析:你准备好了吗?

前言:从MVC到WebApi,路由机制一直是伴随着这些技术的一个重要组成部分. 它可以很简单:如果你仅仅只需要会用一些简单的路由,如/Home/Index,那么你只需要配置一个默认路由就能简单搞定: 它可以很神秘:你的url可以千变万化,看到一些看似“无厘头”的url,感觉很难理解它如何找到匹配的action,例如/api/user/1/detail,这样一个url可以让你纠结半天. 它可以很晦涩:当面试官提问“请简单分析下MVC路由机制的原理”,你可能事先就准备好了答案,然后噼里啪啦一顿(型如

asp.net MVC 5 路由 Routing

ASP.NET MVC ,一个适用于WEB应用程序的经典模型 model-view-controller 模式.相对于web forms一个单一的整块,asp.net mvc是由连接在一起的各种代码层所组成. 最近又接触了关于asp.net mvc的项目,又重拾以前的记忆,感觉忘了好多,特此记录. 首先,来说说路由Routing. ASP.NET MVC 不再是要依赖于物理页面了,你可以使用自己的语法自定义URL,通过这些语法来指定资源和操作.语法通过URL模式集合表达,也称为路由. 路由是代表

ASP.NET MVC学习之路由篇

1.URL路径和路由配置中的路径对比 2.由上面的图,我们可以得出下面的一组路由数据 3.二义性 如果我们在Models中也新建一个Home控制器,那么你会发现重新刷新之后报错了.而这个是因为无法确定到底选择哪个控制器来响应该请求的缘故,当然你认为只要我们不新建重名的控制器就可以了,这样你只能控制你的项目中不出现,但是你却无法控制你加载的类库中不会出现,但是ASP.NET MVC已经提供了解决方案给我们,如下改正 RouteConfig.cs: public class RouteConfig