Exemple #1
0
    private bool ParameterExistsInAnyRoute(ActionModel action, string parameterName)
    {
        foreach (var selector in ActionAttributeRouteModel.FlattenSelectors(action))
        {
            if (selector.AttributeRouteModel == null)
            {
                continue;
            }

            var parsedTemplate = TemplateParser.Parse(selector.AttributeRouteModel.Template !);
            if (parsedTemplate.GetParameter(parameterName) != null)
            {
                return(true);
            }
        }

        return(false);
    }
    public static List <TResult> Flatten <TResult>(
        ApplicationModel application,
        Func <ApplicationModel, ControllerModel, ActionModel, SelectorModel, TResult> flattener)
    {
        var results = new List <TResult>();
        var errors  = new Dictionary <MethodInfo, IList <string> >();

        var actionsByMethod    = new Dictionary <MethodInfo, List <(ActionModel, SelectorModel)> >();
        var actionsByRouteName = new Dictionary <string, List <(ActionModel, SelectorModel)> >(StringComparer.OrdinalIgnoreCase);

        var routeTemplateErrors = new List <string>();

        foreach (var controller in application.Controllers)
        {
            foreach (var action in controller.Actions)
            {
                foreach (var selector in ActionAttributeRouteModel.FlattenSelectors(action))
                {
                    // PostProcess attribute routes so we can observe any errors.
                    ReplaceAttributeRouteTokens(controller, action, selector, routeTemplateErrors);

                    // Add to the data structures we use to find errors.
                    AddActionToMethodInfoMap(actionsByMethod, action, selector);
                    AddActionToRouteNameMap(actionsByRouteName, action, selector);

                    var result = flattener(application, controller, action, selector);
                    Debug.Assert(result != null);

                    results.Add(result);
                }
            }
        }

        var attributeRoutingConfigurationErrors = new Dictionary <MethodInfo, string>();

        foreach (var(method, actions) in actionsByMethod)
        {
            ValidateActionGroupConfiguration(
                method,
                actions,
                attributeRoutingConfigurationErrors);
        }

        if (attributeRoutingConfigurationErrors.Count > 0)
        {
            var message = CreateAttributeRoutingAggregateErrorMessage(attributeRoutingConfigurationErrors.Values);

            throw new InvalidOperationException(message);
        }

        var namedRoutedErrors = ValidateNamedAttributeRoutedActions(actionsByRouteName);

        if (namedRoutedErrors.Count > 0)
        {
            var message = CreateAttributeRoutingAggregateErrorMessage(namedRoutedErrors);
            throw new InvalidOperationException(message);
        }

        if (routeTemplateErrors.Count > 0)
        {
            var message = CreateAttributeRoutingAggregateErrorMessage(routeTemplateErrors);
            throw new InvalidOperationException(message);
        }


        return(results);
    }