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