路由
2012-10-11 00:18 yezhi 阅读(213) 评论(0) 编辑 收藏 举报msdn:http://msdn.microsoft.com/zh-cn/library/cc668201.aspx
IRouteConstraint 接口
定义类必须实现才能检查某 URL 参数值是否对约束有效的协定。
当在路由定义中包含 URL 参数的约束时,您必须将该约束表示为字符串或实现 IRouteConstraint 接口的对象。 如果该约束为字符串,则会将其视为正则表达式。 当您无法轻松地将验证逻辑表示为正则表达式时,可以创建一个实现 IRouteConstraint 的类。 可以将验证逻辑添加到 Match 方法中。
bool Match( HttpContextBase httpContext, Route route, string parameterName,//正在检查的参数的名称。 RouteValueDictionary values, RouteDirection routeDirection )
public class NotEqual:IRouteConstraint { private string _value; public NotEqual(string value) { _value = value; } public bool Match ( HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection ) { var paramValue = values[parameterName].ToString(); return String.Compare(paramValue, _value, true) != 0; } }
global.route:
routes.MapRoute( "DefaultNoAdmin", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = "" }, new { controller = new NotEqual("Admin") } );
IRouteHandler 接口
定义类必须实现才能处理匹配路由模式的请求的协定。
public class CustomRouteHandler : IRouteHandler { public IHttpHandler GetHttpHandler(RequestContext requestContext) { return new CustomHttpHandler(); } } public class CustomHttpHandler : IHttpHandler { public bool IsReusable { get { return false; } } public void ProcessRequest(HttpContext context) { context.Response.Write("Hello"); } }
global.route:
routes.Add(new Route("SayHello", new CustomRouteHandler()));
RouteBase
public class LegacyRoute : RouteBase { private string[] urls; public LegacyRoute(params string[] targetUrls) { urls = targetUrls; } public override RouteData GetRouteData(HttpContextBase httpContext) { RouteData result = null; string requestedURL = httpContext.Request.AppRelativeCurrentExecutionFilePath; if (urls.Contains(requestedURL, StringComparer.OrdinalIgnoreCase)) { result = new RouteData(this, new MvcRouteHandler()); result.Values.Add("controller", "Legacy"); result.Values.Add("action", "GetLegacyURL"); result.Values.Add("legacyURL", requestedURL); } return result; } public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) { VirtualPathData result = null; if (values.ContainsKey("legacyURL") && urls.Contains((string)values["legacyURL"], StringComparer.OrdinalIgnoreCase)) { result = new VirtualPathData(this, new UrlHelper(requestContext) .Content((string)values["legacyURL"]).Substring(1)); } return result; }
global.route:
routes.RouteExistingFiles = true; routes.MapRoute("DiskFile", "Content/StaticContent.html", new { controller = "Account", action = "LogOn", }, new { customConstraint = new UserAgentConstraint("IE") }); routes.IgnoreRoute("Content/{filename}.html"); routes.MapRoute("", "{controller}/{action}"); 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", "POST"), customConstraint = new UserAgentConstraint("IE") }, new[] { "URLsAndRoutes.Controllers" });