代码改变世界

路由

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" });