public static decimal Compute(TParsedRoute parsedRoute, IDictionary <string, object> constraints) { // Each precedence digit corresponds to one decimal place. For example, 3 segments with precedences 2, 1, // and 4 results in a combined precedence of 2.14 (decimal). IList <PathContentSegment> segments = parsedRoute.PathSegments.OfType <PathContentSegment>().ToArray(); decimal precedence = 0; uint divisor = 1; // The first digit occupies the one's place. for (int i = 0; i < segments.Count; i++) { PathContentSegment segment = segments[i]; int digit = ComputeDigit(segment, constraints); Contract.Assert(digit >= 0 && digit < 10); precedence = precedence + Decimal.Divide(digit, divisor); // The next digit occupies the subsequent place (always after the decimal point and growing to the // right). divisor *= 10; } return(precedence); }
public static decimal Compute(TParsedRoute parsedRoute, IDictionary<string, object> constraints) { // Each precedence digit corresponds to one decimal place. For example, 3 segments with precedences 2, 1, // and 4 results in a combined precedence of 2.14 (decimal). IList<PathContentSegment> segments = parsedRoute.PathSegments.OfType<PathContentSegment>().ToArray(); decimal precedence = 0; uint divisor = 1; // The first digit occupies the one's place. for (int i = 0; i < segments.Count; i++) { PathContentSegment segment = segments[i]; int digit = ComputeDigit(segment, constraints); Contract.Assert(digit >= 0 && digit < 10); precedence = precedence + Decimal.Divide(digit, divisor); // The next digit occupies the subsequent place (always after the decimal point and growing to the // right). divisor *= 10; } return precedence; }
/// <summary>Creates a route builder that can build a route matching this context.</summary> /// <param name="template">The route template.</param> /// <param name="constraintResolver"> /// The inline constraint resolver to use, if any; otherwise, <see langword="null"/>. /// </param> /// <returns>A route builder that can build a route matching this context.</returns> public IDirectRouteBuilder CreateBuilder(string template, IInlineConstraintResolver constraintResolver) { DirectRouteBuilder builder = new DirectRouteBuilder(_actions, _targetIsAction); #if ASPNETWEBAPI string prefixedTemplate = BuildRouteTemplate(_prefix, template); #else string prefixedTemplate = BuildRouteTemplate(_areaPrefix, _controllerPrefix, template ?? String.Empty); #endif ValidateTemplate(prefixedTemplate); if (constraintResolver != null) { TRouteDictionary defaults = new TRouteDictionary(); TRouteDictionary constraints = new TRouteDictionary(); string detokenizedTemplate = InlineRouteTemplateParser.ParseRouteTemplate(prefixedTemplate, defaults, constraints, constraintResolver); TParsedRoute parsedRoute = RouteParser.Parse(detokenizedTemplate); decimal precedence = RoutePrecedence.Compute(parsedRoute, constraints); builder.Defaults = defaults; builder.Constraints = constraints; builder.Template = detokenizedTemplate; builder.Precedence = precedence; builder.ParsedRoute = parsedRoute; } else { builder.Template = prefixedTemplate; } return(builder); }
// Accessible for tests internal virtual void ValidateParameters(TParsedRoute parsedRoute) { Contract.Assert(parsedRoute != null); if (parsedRoute.PathSegments != null) { foreach (var contentSegment in parsedRoute.PathSegments.OfType <PathContentSegment>()) { if (contentSegment != null && contentSegment.Subsegments != null) { foreach (var parameterSegment in contentSegment.Subsegments.OfType <PathParameterSubsegment>()) { if (parameterSegment != null) { if (String.Equals(parameterSegment.ParameterName, "controller", StringComparison.OrdinalIgnoreCase)) { throw Error.InvalidOperation(TResources.DirectRoute_InvalidParameter_Controller); } else if (TargetIsAction && String.Equals(parameterSegment.ParameterName, "action", StringComparison.OrdinalIgnoreCase)) { throw Error.InvalidOperation(TResources.DirectRoute_InvalidParameter_Action); } } } } } } }
// Accessible for tests internal virtual void ValidateParameters(TParsedRoute parsedRoute) { Contract.Assert(parsedRoute != null); if (parsedRoute.PathSegments != null) { foreach (var contentSegment in parsedRoute.PathSegments.OfType<PathContentSegment>()) { if (contentSegment != null && contentSegment.Subsegments != null) { foreach (var parameterSegment in contentSegment.Subsegments.OfType<PathParameterSubsegment>()) { if (parameterSegment != null) { if (String.Equals(parameterSegment.ParameterName, "controller", StringComparison.OrdinalIgnoreCase)) { throw Error.InvalidOperation(TResources.DirectRoute_InvalidParameter_Controller); } else if (TargetIsAction && String.Equals(parameterSegment.ParameterName, "action", StringComparison.OrdinalIgnoreCase)) { throw Error.InvalidOperation(TResources.DirectRoute_InvalidParameter_Action); } } } } } } }
internal override void ValidateParameters(TParsedRoute parsedRoute) { TimesValidateParametersCalled++; base.ValidateParameters(parsedRoute); }