Exemple #1
0
        public TestInit()
        {
            var testAssembly = Assembly.Load(new AssemblyName("AspNet.Mvc.TypedRouting.Test"));

            // Run the full controller and action model building
            // in order to simulate the default MVC behavior.
            var options = new TestOptionsManager <MvcOptions>();

            var applicationPartManager = new ApplicationPartManager();

            applicationPartManager.FeatureProviders.Add(new ControllerFeatureProvider());
            applicationPartManager.ApplicationParts.Add(new AssemblyPart(testAssembly));

            var modelProvider = new DefaultApplicationModelProvider(options);

            var provider = new ControllerActionDescriptorProvider(
                applicationPartManager,
                new[] { modelProvider },
                options);

            var serviceCollection = new ServiceCollection();
            var list = new List <IActionDescriptorProvider>()
            {
                provider,
            };

            serviceCollection.AddSingleton(typeof(IEnumerable <IActionDescriptorProvider>), list);
            serviceCollection.AddSingleton(typeof(IActionDescriptorCollectionProvider), typeof(ActionDescriptorCollectionProvider));

            ExpressionRouteHelper.Initialize(serviceCollection.BuildServiceProvider());
        }
Exemple #2
0
        /// <summary>
        /// Generates an absolute URL using the specified route name, <see cref="Expression{TDelegate}"/> for an action method,
        /// from which action name, controller name and route values are resolved, and the specified additional route values.
        /// </summary>
        /// <typeparam name="TController">Controller, from which the action is specified.</typeparam>
        /// <param name="routeName">The name of the route that is used to generate the URL.</param>
        /// <param name="action">
        /// The <see cref="Expression{TDelegate}"/>, from which action name,
        /// controller name and route values are resolved.
        /// </param>
        /// <param name="values">An object that contains additional route values.</param>
        /// <returns>The generated absolute URL.</returns>
        public static string Link <TController>(
            this IUrlHelper helper,
            string routeName,
            Expression <Action <TController> > action,
            object values)
        {
            var expressionRouteValues = ExpressionRouteHelper.Resolve(action, values, addControllerAndActionToRouteValues: true);

            return(helper.Link(routeName, expressionRouteValues.RouteValues));
        }
        public void Resolve_NonControllerAction_ThrowsInvalidOperationException()
        {
            // Act
            var exception = Assert.Throws <InvalidOperationException>(() =>
            {
                ExpressionRouteHelper.Resolve <RequestModel>(c => c.SomeMethod());
            });

            // Assert
            Assert.Equal("Method SomeMethod in class RequestModel is not a valid controller action.", exception.Message);
        }
        public void Resolve_NonMethodCallException_ThrowsInvalidOperationException()
        {
            // Act
            var exception = Assert.Throws <InvalidOperationException>(() =>
            {
                ExpressionRouteHelper.Resolve <NormalController>(c => new object());
            });

            // Assert
            Assert.Equal("Expression is not valid - expected instance method call but instead received other type of expression.", exception.Message);
        }
        public void Resolve_StaticMethodCall_ThrowsInvalidOperationException()
        {
            // Act
            var exception = Assert.Throws <InvalidOperationException>(() =>
            {
                ExpressionRouteHelper.Resolve <NormalController>(c => NormalController.StaticCall());
            });

            // Assert
            Assert.Equal("Expression is not valid - expected instance method call but instead received static method call.", exception.Message);
        }
        public void Resolve_ControllerAndActionWithoutParameters_ControllerAndActionNameAreResolved(
            Expression <Action <NormalController> > action, string controllerName, string actionName)
        {
            // Act
            var result = ExpressionRouteHelper.Resolve(action);

            // Assert
            Assert.Equal(controllerName, result.Controller);
            Assert.Equal(actionName, result.Action);
            Assert.Empty(result.RouteValues);
        }
Exemple #7
0
        /// <summary>
        /// Redirects to the specified action by
        /// using <see cref="Expression{TDelegate}"/> for an action method,
        /// from which action name, controller name and route values are resolved,
        /// and the specified additional route values.
        /// </summary>
        /// <typeparam name="TController">Controller, from which the action is specified.</typeparam>
        /// <param name="action">
        /// The <see cref="Expression{TDelegate}"/>, from which action name,
        /// controller name and route values are resolved.
        /// </param>
        /// <param name="routeValues">Additional route data to use for generating the URL.</param>
        /// <returns>The created <see cref="RedirectToActionResult"/> for the response.</returns>
        public static RedirectToActionResult RedirectToAction <TController>(
            this TController controller,
            Expression <Action <TController> > action,
            object routeValues)
            where TController : Controller
        {
            var expressionRouteValues = ExpressionRouteHelper.Resolve(action, routeValues);

            return(controller.RedirectToAction(
                       expressionRouteValues.Action,
                       expressionRouteValues.RouteValues));
        }
        public void Resolve_PocoController_ControllerActionNameAndParametersAreResolved()
        {
            // Act
            var result = ExpressionRouteHelper.Resolve <PocoController>(c => c.Action(1));

            // Assert
            Assert.Equal("Poco", result.Controller);
            Assert.Equal("Action", result.Action);
            Assert.Equal(1, result.RouteValues.Count);
            Assert.True(result.RouteValues.ContainsKey("id"));
            Assert.Equal(1, result.RouteValues["id"]);
        }
Exemple #9
0
        /// <summary>
        /// Redirects to the specified route with <see cref="RedirectToActionResult.Permanent"/> set to true by
        /// using <see cref="Expression{TDelegate}"/> for an action method,
        /// from which action name, controller name and route values are resolved,
        /// and the specified additional route values.
        /// </summary>
        /// <typeparam name="TRedirectController">Controller, from which the action is specified.</typeparam>
        /// <param name="routeName">The name of the route to use for generating the URL.</param>
        /// <param name="action">
        /// The <see cref="Expression{TDelegate}"/>, from which action name,
        /// controller name and route values are resolved.
        /// </param>
        /// <param name="routeValues">Additional route data to use for generating the URL.</param>
        /// <returns>The created <see cref="RedirectToRouteResult"/> for the response.</returns>
        public static RedirectToRouteResult RedirectToRoutePermanent <TRedirectController>(
            this Controller controller,
            string routeName,
            Expression <Action <TRedirectController> > action,
            object routeValues)
        {
            var expressionRouteValues = ExpressionRouteHelper.Resolve(action, routeValues, addControllerAndActionToRouteValues: true);

            return(controller.RedirectToRoutePermanent(
                       routeName,
                       expressionRouteValues.RouteValues));
        }
Exemple #10
0
        /// <summary>
        /// Redirects to the specified action with <see cref="RedirectToActionResult.Permanent"/> set to true by
        /// using <see cref="Expression{TDelegate}"/> for an action method,
        /// from which action name, controller name and route values are resolved,
        /// and the specified additional route values.
        /// </summary>
        /// <typeparam name="TRedirectController">Controller, from which the action is specified.</typeparam>
        /// <param name="action">
        /// The <see cref="Expression{TDelegate}"/>, from which action name,
        /// controller name and route values are resolved.
        /// </param>
        /// <param name="routeValues">Additional route data to use for generating the URL.</param>
        /// <returns>The created <see cref="RedirectToActionResult"/> for the response.</returns>
        public static RedirectToActionResult RedirectToActionPermanent <TRedirectController>(
            this Controller controller,
            Expression <Action <TRedirectController> > action,
            object routeValues)
        {
            var expressionRouteValues = ExpressionRouteHelper.Resolve(action, routeValues);

            return(controller.RedirectToActionPermanent(
                       expressionRouteValues.Action,
                       expressionRouteValues.Controller,
                       routeValues));
        }
        public void Resolve_CustomConventions_CustomConventionsAreResolved()
        {
            // Act
            var result = ExpressionRouteHelper.Resolve <ConventionsController>(c => c.ConventionsAction(1));

            // Assert
            Assert.Equal("ChangedController", result.Controller);
            Assert.Equal("ChangedAction", result.Action);
            Assert.Equal(1, result.RouteValues.Count);
            Assert.True(result.RouteValues.ContainsKey("ChangedParameter"));
            Assert.Equal(1, result.RouteValues["ChangedParameter"]);
        }
Exemple #12
0
        private static string Action <TController>(
            this IUrlHelper helper,
            Expression <Action <TController> > action,
            UrlActionContext actionContext)
        {
            var expressionRouteValues = ExpressionRouteHelper.Resolve(action, actionContext.Values);

            actionContext.Controller = expressionRouteValues.Controller;
            actionContext.Action     = expressionRouteValues.Action;
            actionContext.Values     = expressionRouteValues.RouteValues;

            return(helper.Action(actionContext));
        }
Exemple #13
0
        /// <summary>
        /// Creates a <see cref="CreatedAtActionResult"/> object that produces a Created (201) response
        /// by using <see cref="Expression{TDelegate}"/> for selecting the action.
        /// </summary>
        /// <typeparam name="TRedirectController">Controller, from which the action is specified.</typeparam>
        /// <param name="action">
        /// The <see cref="Expression{TDelegate}"/>, from which action name,
        /// controller name and route values are resolved.
        /// </param>
        /// <param name="routeValues">Additional route data to use for generating the URL.</param>
        /// <param name="value">The content value to format in the entity body.</param>
        /// <returns>The created <see cref="CreatedAtActionResult"/> for the response.</returns>
        public static CreatedAtActionResult CreatedAtAction <TRedirectController>(
            this Controller controller,
            Expression <Action <TRedirectController> > action,
            object routeValues,
            object value)
        {
            var expressionRouteValues = ExpressionRouteHelper.Resolve(action, routeValues);

            return(controller.CreatedAtAction(
                       expressionRouteValues.Action,
                       expressionRouteValues.Controller,
                       routeValues,
                       value));
        }
Exemple #14
0
        /// <summary>
        /// Creates a <see cref="CreatedAtRouteResult"/> object that produces a Created (201) response.
        /// </summary>
        /// <typeparam name="TRedirectController">Controller, from which the action is specified.</typeparam>
        /// <param name="routeName">The name of the route to use for generating the URL.</param>
        /// <param name="action">
        /// The <see cref="Expression{TDelegate}"/>, from which action name,
        /// controller name and route values are resolved.
        /// </param>
        /// <param name="routeValues">Additional route data to use for generating the URL.</param>
        /// <param name="value">The content value to format in the entity body.</param>
        /// <returns>The created <see cref="CreatedAtRouteResult"/> for the response</returns>
        public static CreatedAtRouteResult CreatedAtRoute <TRedirectController>(
            this Controller controller,
            string routeName,
            Expression <Action <TRedirectController> > action,
            object routeValues,
            object value)
        {
            var expressionRouteValues = ExpressionRouteHelper.Resolve(action, routeValues, addControllerAndActionToRouteValues: true);

            return(controller.CreatedAtRoute(
                       routeName,
                       expressionRouteValues.RouteValues,
                       value));
        }
        public void Resolve_InAreaController_ControllerActionNameAndAreaAreResolved()
        {
            // Act
            var result = ExpressionRouteHelper.Resolve <InAreaController>(c => c.Action(1));

            // Assert
            Assert.Equal("InArea", result.Controller);
            Assert.Equal("Action", result.Action);
            Assert.Equal(2, result.RouteValues.Count);
            Assert.True(result.RouteValues.ContainsKey("id"));
            Assert.Equal(1, result.RouteValues["id"]);
            Assert.True(result.RouteValues.ContainsKey("area"));
            Assert.Equal("MyArea", result.RouteValues["area"]);
        }
        public void Resolve_ActionWithCustomRouteConstraints_RouteConstraintsAreResolved()
        {
            // Act
            var result = ExpressionRouteHelper.Resolve <RouteConstraintController>(c => c.Action(1, 2));

            // Assert
            Assert.Equal("CustomController", result.Controller);
            Assert.Equal("CustomAction", result.Action);
            Assert.Equal(3, result.RouteValues.Count);
            Assert.True(result.RouteValues.ContainsKey("id"));
            Assert.Equal("5", result.RouteValues["id"]);
            Assert.True(result.RouteValues.ContainsKey("key"));
            Assert.Equal("value", result.RouteValues["key"]);
            Assert.True(result.RouteValues.ContainsKey("anotherId"));
            Assert.Equal(2, result.RouteValues["anotherId"]);
        }
        public void Resolve_ControllerAndActionWithPrimitiveParameters_ControllerActionNameAndParametersAreResolved(
            Expression <Action <NormalController> > action, string controllerName, string actionName, IDictionary <string, object> routeValues)
        {
            // Act
            var result = ExpressionRouteHelper.Resolve(action);

            // Assert
            Assert.Equal(controllerName, result.Controller);
            Assert.Equal(actionName, result.Action);
            Assert.Equal(routeValues.Count, result.RouteValues.Count);

            foreach (var routeValue in routeValues)
            {
                Assert.True(result.RouteValues.ContainsKey(routeValue.Key));
                Assert.Equal(routeValue.Value, result.RouteValues[routeValue.Key]);
            }
        }
        public void Resolve_ControllerAndActionWithObjectParameters_ControllerActionNameAndParametersAreResolved()
        {
            // Act
            var result = ExpressionRouteHelper.Resolve <NormalController>(c => c.ActionWithMultipleParameters(1, "string", new RequestModel {
                Integer = 1, String = "Text"
            }));

            // Assert
            Assert.Equal("Normal", result.Controller);
            Assert.Equal("ActionWithMultipleParameters", result.Action);
            Assert.Equal(3, result.RouteValues.Count);
            Assert.Equal(1, result.RouteValues["id"]);
            Assert.Equal("string", result.RouteValues["text"]);
            Assert.IsAssignableFrom <RequestModel>(result.RouteValues["model"]);

            var model = (RequestModel)result.RouteValues["model"];

            Assert.Equal(1, model.Integer);
            Assert.Equal("Text", model.String);
        }
Exemple #19
0
 /// <summary>
 /// Allows using typed expression based link generation in ASP.NET Core MVC application.
 /// </summary>
 public static void UseTypedRouting(this IRouteBuilder routeBuilder)
 {
     ExpressionRouteHelper.Initialize(routeBuilder.ServiceProvider);
 }