public RouteAdapter(RouteItem routeItem) : base(routeItem.Pattern, new MvcRouteHandler()) { if (routeItem == null) throw new ArgumentNullException("routeItem"); _routeItem = routeItem; if (_routeItem.Ignore) { _route = new IgnoreRoute(routeItem.Pattern) { Constraints = GetConstraints(routeItem) }; } else if (_routeItem.Redirect) { _route = new RedirectRoute(routeItem.Pattern, _routeItem.RedirectParams); } else { var route = new Route(routeItem.Pattern, new MvcRouteHandler()) { Defaults = GetDefaults(routeItem), Constraints = GetConstraints(routeItem), DataTokens = routeItem.DataTokens != null ? new RouteValueDictionary(routeItem.DataTokens) : new RouteValueDictionary(), RouteExistingFiles = routeItem.RouteExistingFiles }; if (routeItem.Namespaces != null && routeItem.Namespaces.Length > 0) route.DataTokens["Namespaces"] = routeItem.Namespaces; else if (routeItem.Area != null && routeItem.Area.Namespaces != null && routeItem.Area.Namespaces.Length > 0) route.DataTokens["Namespaces"] = routeItem.Area.Namespaces; if (routeItem.Area != null) { route.DataTokens["area"] = routeItem.Area.Name; var namespaces = (routeItem.Namespaces == null && routeItem.Area.Namespaces != null) ? routeItem.Area.Namespaces : routeItem.Namespaces; route.DataTokens["UseNamespaceFallback"] = (namespaces == null || namespaces.Length == 0); } _route = route; Url = _route.Url; DataTokens = _route.DataTokens; Constraints = _route.Constraints; Defaults = _route.Defaults; } }
private RouteValueDictionary GetConstraints(RouteItem routeItem) { var constraints = new RouteValueDictionary(); if (routeItem.HttpMethods != null && routeItem.HttpMethods.Length > 0) constraints.Add("httpMethod", new HttpMethodConstraint(routeItem.HttpMethods)); if (!String.IsNullOrEmpty(routeItem.Constraint)) constraints.Add("custom", CreateConstraintInstance(routeItem.Constraint)); if (routeItem.Constraints != null) { foreach (var constraint in routeItem.Constraints.Where(p => !p.Disabled)) { constraints.Add(constraint.Name, CreateConstraintInstance(constraint.Value)); } } if (routeItem.Params != null) { foreach (var routeParam in routeItem.Params) { if (!String.IsNullOrEmpty(routeParam.Type)) { if (routeParam.Type == "int") constraints.Add(routeParam.Name, @"^\d+$"); else if (routeParam.Type == "date") constraints.Add(routeParam.Name, @"\d{4}-\d{2}-\d{2}"); } if (!String.IsNullOrEmpty(routeParam.Constraint)) constraints.Add(routeParam.Name, routeParam.Constraint); } } return constraints; }
private RouteValueDictionary GetDefaults(RouteItem routeItem) { var defaults = new RouteValueDictionary(); if (!string.IsNullOrEmpty(routeItem.Controller)) defaults.Add("controller", routeItem.Controller); if (!string.IsNullOrEmpty(routeItem.Action)) defaults.Add("action", routeItem.Action); if (routeItem.Params != null) { foreach (var routeParam in routeItem.Params) { defaults.Add(routeParam.Name, routeParam.Optional ? (object)UrlParameter.Optional : (object)routeParam.Value); } } return defaults; }
private List<RouteItem> GetRouteItems(XElement el, bool isArea = false) { var routeItems = new List<RouteItem>(); if (el == null) return routeItems; XElement routes = isArea ? el.Element("routes") : el; foreach (var e in routes.Elements().Where(e => e.Name.ToString().Equals("map") || e.Name.ToString().Equals("ignore") || e.Name.ToString().Equals("redirect"))) { var routeItem = new RouteItem { Name = GetAttributeVal(e, "name"), Pattern = GetAttributeVal(e, "pattern"), Area = isArea ? new Area { Name = GetAttributeVal(el, "name"), Namespaces = el.Element("namespaces") != null ? el.Element("namespaces").Elements("ns").Select(t => t.Value).ToArray() : new string[] { } } : null, Disabled = !String.IsNullOrEmpty(GetAttributeVal(e, "disabled")) ? bool.Parse(GetAttributeVal(e, "disabled")) : false, Ignore = e.Name.ToString().Equals("ignore"), Redirect = e.Name.ToString().Equals("redirect") }; if (routeItem.Redirect) { routeItem.RedirectParams = new RedirectParams { RedirectTo = GetAttributeVal(e, "to"), IsPermanent = !String.IsNullOrEmpty(GetAttributeVal(e, "permanent")) ? bool.Parse(GetAttributeVal(e, "permanent")) : true }; } else { routeItem.HttpMethods = !String.IsNullOrEmpty(GetAttributeVal(e, "method")) ? GetAttributeVal(e, "method").Split(',') : null; routeItem.Constraint = GetAttributeVal(e, "constraint"); routeItem.Constraints = e.Element("constraints") != null ? e.Element("constraints").Elements("constraint").Select(c => new RouteConstraint { Name = GetAttributeVal(c, "name"), Value = GetAttributeVal(c, "value"), Disabled = !String.IsNullOrEmpty(GetAttributeVal(c, "disabled")) ? bool.Parse(GetAttributeVal(c, "disabled")) : false, }).ToArray() : null; }; if (!routeItem.Ignore && !routeItem.Redirect) { routeItem.Controller = GetAttributeVal(e, "controller"); routeItem.Action = GetAttributeVal(e, "action"); routeItem.RouteExistingFiles = !String.IsNullOrEmpty(GetAttributeVal(e, "routefiles")) ? bool.Parse(GetAttributeVal(e, "routefiles")) : false; routeItem.Params = e.Element("params") != null ? e.Element("params").Elements("param").Select(p => new RouteParam { Name = GetAttributeVal(p, "name"), Value = GetAttributeVal(p, "value"), Type = GetAttributeVal(p, "type"), Optional = !String.IsNullOrEmpty(GetAttributeVal(p, "optional")) ? bool.Parse(GetAttributeVal(p, "optional")) : false, Constraint = GetAttributeVal(p, "constraint") }).ToArray() : null; routeItem.DataTokens = e.Element("tokens") != null ? e.Element("tokens").Elements("token").ToDictionary(i => GetAttributeVal(i, "name"), i => (object)GetAttributeVal(i, "value")) : null; routeItem.Namespaces = e.Element("namespaces") != null ? e.Element("namespaces").Elements("ns").Select(t => t.Value).ToArray() : null; } if (isArea) { var areaNs = GetAttributeVal(el, "ns"); if (!string.IsNullOrEmpty(areaNs)) { if (routeItem.Namespaces == null) routeItem.Namespaces = new[] { String.Concat(areaNs, ".*") }; else routeItem.Namespaces[routeItem.Namespaces.Length] = String.Concat(areaNs, ".*"); } } routeItems.Add(routeItem); } return routeItems; }