Exemplo n.º 1
0
        private static AttributeRouteLinkGenerationEntry CreateGenerationEntry(string template, object requiredValues)
        {
            var constraintResolver = CreateConstraintResolver();

            var entry = new AttributeRouteLinkGenerationEntry();

            entry.Template = TemplateParser.Parse(template, constraintResolver);

            var defaults = entry.Template.Parameters
                           .Where(p => p.DefaultValue != null)
                           .ToDictionary(p => p.Name, p => p.DefaultValue);

            var constraints = entry.Template.Parameters
                              .Where(p => p.InlineConstraint != null)
                              .ToDictionary(p => p.Name, p => p.InlineConstraint);

            entry.Constraints        = constraints;
            entry.Defaults           = defaults;
            entry.Binder             = new TemplateBinder(entry.Template, defaults);
            entry.Precedence         = AttributeRoutePrecedence.Compute(entry.Template);
            entry.RequiredLinkValues = new RouteValueDictionary(requiredValues);
            entry.RouteGroup         = template;

            return(entry);
        }
Exemplo n.º 2
0
        private static decimal Compute(string template)
        {
            var options = new Mock <IOptions <RouteOptions> >();

            options.SetupGet(o => o.Options).Returns(new RouteOptions());

            var parsed = TemplateParser.Parse(template);

            return(AttributeRoutePrecedence.Compute(parsed));
        }
Exemplo n.º 3
0
        private static decimal Compute(string template)
        {
            var options = new Mock <IOptions <RouteOptions> >();

            options.SetupGet(o => o.Options).Returns(new RouteOptions());

            var constraintResolver = new DefaultInlineConstraintResolver(
                Mock.Of <IServiceProvider>(),
                options.Object);

            var parsed = TemplateParser.Parse(template, constraintResolver);

            return(AttributeRoutePrecedence.Compute(parsed));
        }
Exemplo n.º 4
0
        private static RouteInfo GetRouteInfo(
            IInlineConstraintResolver constraintResolver,
            Dictionary <string, Template> templateCache,
            ActionDescriptor action)
        {
            var constraint = action.RouteConstraints
                             .Where(c => c.RouteKey == AttributeRouting.RouteGroupKey)
                             .FirstOrDefault();

            if (constraint == null ||
                constraint.KeyHandling != RouteKeyHandling.RequireKey ||
                constraint.RouteValue == null)
            {
                // This can happen if an ActionDescriptor has a route template, but doesn't have one of our
                // special route group constraints. This is a good indication that the user is using a 3rd party
                // routing system, or has customized their ADs in a way that we can no longer understand them.
                //
                // We just treat this case as an 'opt-out' of our attribute routing system.
                return(null);
            }

            var routeInfo = new RouteInfo()
            {
                ActionDescriptor = action,
                RouteGroup       = constraint.RouteValue,
                RouteTemplate    = action.AttributeRouteTemplate,
            };

            try
            {
                Template parsedTemplate;
                if (!templateCache.TryGetValue(action.AttributeRouteTemplate, out parsedTemplate))
                {
                    // Parsing with throw if the template is invalid.
                    parsedTemplate = TemplateParser.Parse(action.AttributeRouteTemplate, constraintResolver);
                    templateCache.Add(action.AttributeRouteTemplate, parsedTemplate);
                }

                routeInfo.ParsedTemplate = parsedTemplate;
            }
            catch (Exception ex)
            {
                routeInfo.ErrorMessage = ex.Message;
                return(routeInfo);
            }

            foreach (var kvp in action.RouteValueDefaults)
            {
                foreach (var parameter in routeInfo.ParsedTemplate.Parameters)
                {
                    if (string.Equals(kvp.Key, parameter.Name, StringComparison.OrdinalIgnoreCase))
                    {
                        routeInfo.ErrorMessage = Resources.FormatAttributeRoute_CannotContainParameter(
                            routeInfo.RouteTemplate,
                            kvp.Key,
                            kvp.Value);

                        return(routeInfo);
                    }
                }
            }

            routeInfo.Precedence = AttributeRoutePrecedence.Compute(routeInfo.ParsedTemplate);

            routeInfo.Constraints = routeInfo.ParsedTemplate.Parameters
                                    .Where(p => p.InlineConstraint != null)
                                    .ToDictionary(p => p.Name, p => p.InlineConstraint, StringComparer.OrdinalIgnoreCase);

            routeInfo.Defaults = routeInfo.ParsedTemplate.Parameters
                                 .Where(p => p.DefaultValue != null)
                                 .ToDictionary(p => p.Name, p => p.DefaultValue, StringComparer.OrdinalIgnoreCase);

            return(routeInfo);
        }