private static void ReplaceAttributeRouteTokens(
            ControllerActionDescriptor actionDescriptor,
            IList <string> routeTemplateErrors)
        {
            try
            {
                actionDescriptor.AttributeRouteInfo.Template = AttributeRouteModel.ReplaceTokens(
                    actionDescriptor.AttributeRouteInfo.Template,
                    actionDescriptor.RouteValueDefaults);

                if (actionDescriptor.AttributeRouteInfo.Name != null)
                {
                    actionDescriptor.AttributeRouteInfo.Name = AttributeRouteModel.ReplaceTokens(
                        actionDescriptor.AttributeRouteInfo.Name,
                        actionDescriptor.RouteValueDefaults);
                }
            }
            catch (InvalidOperationException ex)
            {
                // Routing will throw an InvalidOperationException here if we can't parse/replace tokens
                // in the template.
                var message = Resources.FormatAttributeRoute_IndividualErrorMessage(
                    actionDescriptor.DisplayName,
                    Environment.NewLine,
                    ex.Message);

                routeTemplateErrors.Add(message);
            }
        }
Esempio n. 2
0
        private static void ReplaceAttributeRouteTokens(
            ControllerActionDescriptor actionDescriptor,
            IList <string> routeTemplateErrors)
        {
            try
            {
                actionDescriptor.Properties.TryGetValue(typeof(IOutboundParameterTransformer), out var transformer);
                var routeTokenTransformer = transformer as IOutboundParameterTransformer;

                actionDescriptor.AttributeRouteInfo.Template = AttributeRouteModel.ReplaceTokens(
                    actionDescriptor.AttributeRouteInfo.Template,
                    actionDescriptor.RouteValues,
                    routeTokenTransformer);

                if (actionDescriptor.AttributeRouteInfo.Name != null)
                {
                    actionDescriptor.AttributeRouteInfo.Name = AttributeRouteModel.ReplaceTokens(
                        actionDescriptor.AttributeRouteInfo.Name,
                        actionDescriptor.RouteValues,
                        routeTokenTransformer);
                }
            }
            catch (InvalidOperationException ex)
            {
                // Routing will throw an InvalidOperationException here if we can't parse/replace tokens
                // in the template.
                var message = Resources.FormatAttributeRoute_IndividualErrorMessage(
                    actionDescriptor.DisplayName,
                    Environment.NewLine,
                    ex.Message);

                routeTemplateErrors.Add(message);
            }
        }
    public void ReplaceTokens_ValidValues(string template, Dictionary <string, string> values, string expected)
    {
        // Arrange
        // Act
        var result = AttributeRouteModel.ReplaceTokens(template, values);

        // Assert
        Assert.Equal(expected, result);
    }
    private static void ReplaceAttributeRouteTokens(
        ControllerModel controller,
        ActionModel action,
        SelectorModel selector,
        List <string> errors)
    {
        if (selector.AttributeRouteModel == null)
        {
            return;
        }

        try
        {
            var routeValues = new Dictionary <string, string?>(StringComparer.OrdinalIgnoreCase)
            {
                { "action", action.ActionName },
                { "controller", controller.ControllerName },
            };

            foreach (var kvp in action.RouteValues)
            {
                routeValues.TryAdd(kvp.Key, kvp.Value);
            }

            foreach (var kvp in controller.RouteValues)
            {
                routeValues.TryAdd(kvp.Key, kvp.Value);
            }

            selector.AttributeRouteModel.Template = AttributeRouteModel.ReplaceTokens(
                selector.AttributeRouteModel.Template !,
                routeValues,
                action.RouteParameterTransformer);

            if (selector.AttributeRouteModel.Name != null)
            {
                selector.AttributeRouteModel.Name = AttributeRouteModel.ReplaceTokens(
                    selector.AttributeRouteModel.Name,
                    routeValues,
                    action.RouteParameterTransformer);
            }
        }
        catch (InvalidOperationException ex)
        {
            // Routing will throw an InvalidOperationException here if we can't parse/replace tokens
            // in the template.
            var message = Resources.FormatAttributeRoute_IndividualErrorMessage(
                action.DisplayName,
                Environment.NewLine,
                ex.Message);

            errors.Add(message);
        }
    }
    public void ReplaceTokens_InvalidFormat(string template, Dictionary <string, string> values, string reason)
    {
        // Arrange
        var expected = string.Format(
            CultureInfo.InvariantCulture,
            "The route template '{0}' has invalid syntax. {1}",
            template,
            reason);

        // Act
        var ex = Assert.Throws <InvalidOperationException>(
            () => { AttributeRouteModel.ReplaceTokens(template, values); });

        // Assert
        Assert.Equal(expected, ex.Message);
    }
        private static void ReplaceAttributeRouteTokens(
            ControllerActionDescriptor actionDescriptor,
            IList <string> routeTemplateErrors)
        {
            try
            {
                actionDescriptor.AttributeRouteInfo.Template = AttributeRouteModel.ReplaceTokens(
                    actionDescriptor.AttributeRouteInfo.Template,
                    actionDescriptor.RouteValueDefaults);
            }
            catch (InvalidOperationException ex)
            {
                var message = Resources.FormatAttributeRoute_IndividualErrorMessage(
                    actionDescriptor.DisplayName,
                    Environment.NewLine,
                    ex.Message);

                routeTemplateErrors.Add(message);
            }
        }
    public void ReplaceTokens_UnknownValue(string template, string token)
    {
        // Arrange
        var values = new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase)
        {
            { "area", "Help" },
            { "controller", "Admin" },
            { "action", "SeeUsers" },
        };

        var expected =
            $"While processing template '{template}', " +
            $"a replacement value for the token '{token}' could not be found. " +
            "Available tokens: 'action, area, controller'. To use a '[' or ']' as a literal string in a " +
            "route or within a constraint, use '[[' or ']]' instead.";

        // Act
        var ex = Assert.Throws <InvalidOperationException>(
            () => { AttributeRouteModel.ReplaceTokens(template, values); });

        // Assert
        Assert.Equal(expected, ex.Message);
    }