Пример #1
0
        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;
              }
        }
Пример #2
0
        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;
        }
Пример #3
0
        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;
        }
Пример #4
0
        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;
        }