[翻译:ASP.NET MVC 教程]创建自定义路由约束
本教程的目标是向你展示怎样创建一个自定义路由约束。自定义路由约束能使你防止一个路由被匹配,除非某个自定义表达式被匹配时。
在本教程中,我们创建了一个Localhost路由约束。Localhost路由约束仅匹配由本地计算机所发出的请求。跨Internet的远程请求将不被匹配。
通过实现IRouteConstraint接口,你可以实现一个自定义路由约束。这是一个极为简单的描述了一个单一方法的接口:
bool Match( HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection )
该方法返回一个布尔值。如果返回false,与该约束相关联的路由将不匹配浏览器的请求。
Localhost约束包含在清单1中。
清单1——LocalhostConstraint.cs
using System.Web;
using System.Web.Routing;
namespace MvcApplication1.Constraints
{
public class LocalhostConstraint : IRouteConstraint
{
public bool Match ( HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection )
{
return httpContext.Request.IsLocal;
}
}
}
清单1中的约束利用了HttpRequest类中的IsLocal属性。当请求的IP地址为127.0.0.1或当请求的IP与服务器的IP地址相同时,该属性值返回true。
你使用一个定义在Global.asax文件内部的自定义约束。清单2中的Global.asax文件使用Localhost约束来防止任何人请求Admin页面,除非他们从本地服务器发出请求。例如,请求/Admin/DeleteAll将会失败,当该请求从远程服务器发出时。
清单2——Global.asax
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using MvcApplication1.Constraints;
namespace MvcApplication1
{
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute( "Admin", "Admin/{action}", new {controller="Admin"}, new {isLocal=new LocalhostConstraint()} );
//routes.MapRoute( // "Default", // Route name // "{controller}/{action}/{id}", // URL with parameters // new { controller = "Home", action = "Index", id = "" } // Parameter defaults //);
}
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
}
}
Localhost约束在Admin路由的定义中被使用。该路由将不与远程浏览器请求匹配。然而,事实上其它在定义在Global.asax文件中的路由也可能匹配相同的请求。理解一个约束防止特定路由与某一请求匹配以及并不是所有的路由都定义在Global.asax文件中是很重要的。
注意到Default路由已在清单2中被注释掉了。如果你包含了Default路由,那么该路由将为Admin控制器匹配请求。在那种情况下,远程用户仍然能请求Admin控制器的动作,即使他们的请求不与Admin路由匹配。
文章出处:Kinglee’s Blog (http://www.cnblogs.com/Kinglee/)
版权声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。