加载中...

第三站 路由模板中强大的自定义IRouteConstraint约束


我们在写mvc的时候,经常会配置各种url模板,比如controller,action,id 组合模式,其实呢,我们还可以对这三个参数进行单独的配置,采用的方式自然

就是MapRoute中的constraints属性。

一:简单的正则匹配

    正则匹配算是最最简单的一个方法,比如针对上面路由中id的值,我可以用正则进行限定,也就是说id只能是整数,这个可以做到吗???对这么扩展性极强的mvc,

当然可以做到,比如我下面写的这样:

            routes.MapRoute(
                name: "Default",
                url: "{controller}/{action}/{id}",
                defaults: new { controller = "Home", action = "Index" },
                constraints: new { id = @"\d+" }
            );

然后,我输入一个正确的url,效果是这样的。

当我把id改成abc的话,效果居然是这样滴。。。。

牛逼吧,页面已经无法打开,是不是很开心,接着就有吊毛找你,这个id限制能不能再强大点,根据数据库的配置,或者第三方逻辑来显示到底要不要显示,

这时候是不是有点悲剧,目前的id貌似只有正则匹配,貌似并不能强大到自定义逻辑控制id值,不过不要灰心,刚才我也说了,mvc是一个扩展性极强的框架,

这点事情自己有办法处理。

二:IRouteConstraint 强大的自定义逻辑验证

      可以看到IRouteConstraint 是一个接口,接口定义如下:

在这个接口中提供了一个Match方法,而我要做的就是实现一个继承它的类就可以了,当返回true代表通过,返回false代表匹配失败。。。。就像我现在

这样的烂代码:

要看清楚哦。。。在我实现的MyRouteConstraint类中的Match方法,我通过values[parameterName]可以成功获取id的值,不行我可以调试给亲看。。。

拿到这个值之后,你就可以肆意的去玩耍了。。。

三:源码分析

到现在为止,你是不是很好奇这吊毛玩意是怎么实现的。。。。其实很简单的哦,还记得各种mvc入门书籍中说,路由路由的概念。。。其实呢,也就是一个

Route类而已嘛。。。就像下面这样。

而Route类中,最最重要的莫过于GetRouteData方法,它就是用来决定是否可以看心情把你这个http请求送到Controller中去。。。然后我们再来看看

这个方法的源代码。。。

最终,功夫不负有心人,两串最核心的代码展现在你的面前。

1. constraint as IRouteConstraint   如果当前是IRouteConstraint类型,走我实现的Match方法。

2. constraint as string                  走我的正则匹配,如:Regex.IsMatch。。。。


还没有评论.