コード例 #1
0
        public void Build_WithControllerPropertiesSet_AddsPropertiesWithBinderMetadataSet()
        {
            // Arrange
            var applicationModel = new ApplicationModel();
            var controller = new ControllerModel(typeof(TestController).GetTypeInfo(),
                                                 new List<object>() { });
            controller.ControllerProperties.Add(
                new PropertyModel(
                    controller.ControllerType.GetProperty("BoundProperty"),
                    new List<object>() { })
                {
                    BindingInfo = BindingInfo.GetBindingInfo(new object[] { new FromQueryAttribute() }),
                    PropertyName = "BoundProperty"
                });

            controller.ControllerProperties.Add(
               new PropertyModel(controller.ControllerType.GetProperty("UnboundProperty"), new List<object>() { }));

            controller.Application = applicationModel;
            applicationModel.Controllers.Add(controller);

            var methodInfo = typeof(TestController).GetMethod("SomeAction");
            var actionModel = new ActionModel(methodInfo, new List<object>() { });
            actionModel.Controller = controller;
            controller.Actions.Add(actionModel);

            // Act
            var descriptors = ControllerActionDescriptorBuilder.Build(applicationModel);

            // Assert
            var property = Assert.Single(descriptors.Single().BoundProperties);
            Assert.Equal("BoundProperty", property.Name);
            Assert.Equal(typeof(string), property.ParameterType);
            Assert.Equal(BindingSource.Query, property.BindingInfo.BindingSource);
        }
 public void Apply(ApplicationModel application)
 {
     foreach (var controller in application.Controllers)
     {
         if (Routes.ContainsKey(controller.ControllerType))
         {
             var typedRoutes = Routes[controller.ControllerType];
             foreach (var route in typedRoutes)
             {
                 var action = controller.Actions.FirstOrDefault(x => x.ActionMethod == route.ActionMember);
                 if (action != null)
                 {
                     action.AttributeRouteModel = route;
                     foreach (var method in route.HttpMethods)
                     {
                         action.HttpMethods.Add(method);
                     }
                 }
                 else
                 {
                     controller.AttributeRoutes.Add(route);
                 }
             }
         }
     }
 }
コード例 #3
0
    public void Apply(ApplicationModel application)
    {
        foreach (var controller in application.Controllers)
        { 
            var newActions = new List<ActionModel>();
            foreach (var action in controller.Actions)
            {
                var localizedRouteAttributes = action.Attributes.OfType<LocalizedRouteAttribute>().ToArray();
                if (localizedRouteAttributes.Any())
                {
                    foreach (var localizedRouteAttribute in localizedRouteAttributes)
                    {
                        var localizedVersions = GetLocalizedVersionsForARoute(localizedRouteAttribute.Name);

                        foreach (var localizedVersion in localizedVersions)
                        {
                            var newAction = new ActionModel(action)
                            {
                                AttributeRouteModel = localizedVersion,
                            };
                            newAction.Properties["culture"] = new CultureInfo(((LocalizedRouteAttribute) localizedVersion.Attribute).Culture ?? "en-US");
                            newAction.Filters.Add(new LocalizedRouteFilter());
                            newActions.Add(newAction);
                        }
                    }
                }
            }

            foreach (var newAction in newActions)
            {
                controller.Actions.Add(newAction);
            }
        }
    }
コード例 #4
0
 public void Apply(ApplicationModel application)
 {
     application.ApiExplorer.IsVisible = true;
     foreach (var controller in application.Controllers)
     {
         controller.ApiExplorer.GroupName = controller.ControllerName;
     }
 }
コード例 #5
0
 public void Apply(ApplicationModel application)
 {
     foreach (var controller in application.Controllers)
     {
         if (controller.ControllerType == _type)
         {
             controller.ApiExplorer.IsVisible = false;
         }
     }
 }
        public void Apply(ApplicationModel application)
        {
            //Remove controllers from the application model that are not in the accepted namespace
            application.Controllers.RemoveAll(controller => !controller.ControllerType.FullName.StartsWith(options.Namespace));

            //Remove any actions found that aren't the accepted single action method name from the application model
            foreach(var controllerModel in application.Controllers) {
                controllerModel.Actions.RemoveAll(x => x.ActionName != options.ActionMethodName);
            }
        }
コード例 #7
0
 public void Apply(ApplicationModel application)
 {
     foreach (var controller in application.Controllers)
         if (controller.AttributeRoutes.Any())
             for (var i = 0; i < controller.AttributeRoutes.Count; i++)
                 controller.AttributeRoutes[i] = AttributeRouteModel.CombineAttributeRouteModel(_centralPrefix,
                     controller.AttributeRoutes[i]);
         else
             controller.AttributeRoutes.Add(_centralPrefix);
 }
        public void Apply(ApplicationModel application)
        {
            foreach (var controller in application.Controllers.Where(x => x.ControllerName == "_"))
            {
                var name = controller.ControllerType.AsType()?.Namespace?.Split('.').Last();

                if (name != null)
                {
                    controller.ControllerName = name;
                }
            }
        }
コード例 #9
0
        public void Apply(ApplicationModel application)
        {
            application.ApiExplorer.IsVisible = true;
            foreach (var controller in application.Controllers)
            {
                controller.ApiExplorer.GroupName = controller.ControllerName;

                foreach (var action in controller.Actions)
                {
                    AddProperties(action, controller.Attributes);
                }
            }
        }
コード例 #10
0
 public void Apply(ApplicationModel model)
 {
     foreach (var c in model.Controllers)
     {
         if (typeof(SurfaceController).IsAssignableFrom(c.ControllerType))
         {
             foreach (var a in c.Actions)
             {
                 a.HttpMethods.Add("POST");
             }
         }
     }
 }
コード例 #11
0
        public void Apply(ApplicationModel application)
        {
            foreach(var controller in application.Controllers)
            {
                var module = controller.ControllerType.Assembly.FullName;
                var splitIndex = module.IndexOf(',');
                if (splitIndex > 0)
                {
                    module = module.Substring(0, splitIndex);
                }

                controller.RouteConstraints.Add(new AreaAttribute(module));
            }
        }
コード例 #12
0
            /// <inheritdoc />
            public void Apply(ApplicationModel application)
            {
                if (application == null)
                {
                    throw new ArgumentNullException(nameof(application));
                }

                foreach (var controller in application.Controllers)
                {
                    foreach (var action in controller.Actions)
                    {
                        _actionModelConvention.Apply(action);
                    }
                }
            }
コード例 #13
0
        public void DefaultControllerModelConvention_AppliesToAllControllers()
        {
            // Arrange
            var options = new MvcOptions();
            var app = new ApplicationModel();
            app.Controllers.Add(new ControllerModel(typeof(HelloController).GetTypeInfo(), new List<object>()));
            app.Controllers.Add(new ControllerModel(typeof(WorldController).GetTypeInfo(), new List<object>()));
            options.Conventions.Add(new SimpleControllerConvention());

            // Act
            options.Conventions[0].Apply(app);

            // Assert
            foreach (var controller in app.Controllers)
            {
                Assert.True(controller.Properties.ContainsKey("TestProperty"));
            }
        }
コード例 #14
0
        internal protected ApplicationModel BuildModel()
        {
            var applicationModel = new ApplicationModel();
            foreach (var filter in _globalFilters)
            {
                applicationModel.Filters.Add(filter);
            }

            foreach (var type in _controllerTypeProvider.ControllerTypes)
            {
                var controllerModel = _applicationModelBuilder.BuildControllerModel(type);
                if (controllerModel != null)
                {
                    controllerModel.Application = applicationModel;
                    applicationModel.Controllers.Add(controllerModel);
                }
            }

            return applicationModel;
        }
コード例 #15
0
 /// <summary>
 /// Called to apply the convention to the <see cref="ApplicationModel"/>.
 /// </summary>
 /// <param name="application"> The<see cref="ApplicationModel"/>.</param>
 public virtual void Apply(ApplicationModel application)
 {
     var centralPrefix = new AttributeRouteModel(new RouteAttribute(template));
     foreach (var controller in application.Controllers)
     {
         if (controller.AttributeRoutes.Count > 0)
         {
             for (var i = 0; i < controller.AttributeRoutes.Count; ++i)
             {
                 controller.AttributeRoutes[i] = AttributeRouteModel.CombineAttributeRouteModel(
                     centralPrefix,
                     controller.AttributeRoutes[i]);
             }
         }
         else
         {
             controller.AttributeRoutes.Add(centralPrefix);
         }
     }
 }
コード例 #16
0
 public void Apply(ApplicationModel application)
 {
     foreach (var controller in application.Controllers)
     {
         foreach (var action in controller.Actions)
         {
             foreach (var parameter in action.Parameters)
             {
                 if (parameter.BinderMetadata is IBinderMetadata || ValueProviderResult.CanConvertFromString(parameter.ParameterInfo.ParameterType))
                 {
                     // behavior configured or simple type so do nothing
                 }
                 else
                 {
                     // Complex types are by-default from the body.
                     parameter.BinderMetadata = new FromBodyAttribute();
                 }
             }
         }
     }
 }
コード例 #17
0
        public void Build_WithPropertiesSet_FromApplicationModel()
        {
            // Arrange
            var applicationModel = new ApplicationModel();
            applicationModel.Properties["test"] = "application";

            var controller = new ControllerModel(typeof(TestController).GetTypeInfo(),
                                                 new List<object>() { });
            controller.Application = applicationModel;
            applicationModel.Controllers.Add(controller);

            var methodInfo = typeof(TestController).GetMethod("SomeAction");
            var actionModel = new ActionModel(methodInfo, new List<object>() { });
            actionModel.Controller = controller;
            controller.Actions.Add(actionModel);

            // Act
            var descriptors = ControllerActionDescriptorBuilder.Build(applicationModel);

            // Assert
            Assert.Equal("application", descriptors.Single().Properties["test"]);
        }
コード例 #18
0
        public void Apply(ApplicationModel application)
        {
            foreach (var controller in application.Controllers)
            {
                if (controller.AttributeRoutes.Count == 0)
                {
                    //Create new attribute Route for the controller
                    var attributeRouteModel = new AttributeRouteModel();

                    //Replace the . in the namespace with a / to create the attribute route 
                    //Ex: MySite.Admin namespace will correspond to MySite/Admin attribute route
                    //Then attach [controller], [action] and optional {id?} token. 
                    //[Controller] and [action] is replaced with the controller and action 
                    //name to generate the final template
                    var template = controller.ControllerType.Namespace.Replace('.', '/') + "/[controller]/[action]/{id?}";
                    attributeRouteModel.Template = template;

                    controller.AttributeRoutes.Add(attributeRouteModel);
                }
            }

            //You can continue to put attribute route templates for the controller actions depending on the way you want them to behave            
        }
 public void Apply(ApplicationModel application)
 {
     foreach (var controller in application.Controllers)
     {
         foreach (var action in controller.Actions)
         {
             foreach (var parameter in action.Parameters)
             {
                 if (parameter.BindingInfo?.BindingSource != null ||
                     parameter.Attributes.OfType<IBindingSourceMetadata>().Any() ||
                     ValueProviderResult.CanConvertFromString(parameter.ParameterInfo.ParameterType))
                 {
                     // behavior configured or simple type so do nothing
                 }
                 else
                 {
                     // Complex types are by-default from the body.
                     parameter.BindingInfo = parameter.BindingInfo ?? new BindingInfo();
                     parameter.BindingInfo.BindingSource = BindingSource.Body;
                 }
             }
         }
     }
 }
コード例 #20
0
        public void Apply(ApplicationModel model)
        {
            foreach (var controller in model.Controllers)
            {
                var ns = controller.ControllerType.Namespace.Split('.');
				if (ns.Length < 4)
					continue;

				var actionName = controller.ControllerName;
				var areas = ns[ns.Length - 4];
				var areaName = ns[ns.Length - 3];
				var app = ns[ns.Length - 2];
				var controllerName = ns[ns.Length - 1];

				if (!string.Equals(areas, "areas", System.StringComparison.OrdinalIgnoreCase) || !string.Equals(app, "app", System.StringComparison.OrdinalIgnoreCase))
					continue;

				controller.RouteConstraints.Add(new AreaAttribute(areaName));
				controller.ControllerName = controllerName;

				foreach (var action in controller.Actions)
					action.ActionName = actionName;
			}
        }
コード例 #21
0
 public void Apply(ApplicationModel application)
 {
     application.Properties["description"] = _description;
 }
コード例 #22
0
        /// <summary>
        /// Applies conventions to a <see cref="ApplicationModel"/>.
        /// </summary>
        /// <param name="applicationModel">The <see cref="ApplicationModel"/>.</param>
        /// <param name="conventions">The set of conventions.</param>
        public static void ApplyConventions(
            ApplicationModel applicationModel,
            IEnumerable<IApplicationModelConvention> conventions)
        {
            if (applicationModel == null)
            {
                throw new ArgumentNullException(nameof(applicationModel));
            }

            if (conventions == null)
            {
                throw new ArgumentNullException(nameof(conventions));
            }

            // Conventions are applied from the outside-in to allow for scenarios where an action overrides
            // a controller, etc.
            foreach (var convention in conventions)
            {
                convention.Apply(applicationModel);
            }

            // First apply the conventions from attributes in decreasing order of scope.
            foreach (var controller in applicationModel.Controllers)
            {
                // ToArray is needed here to prevent issues with modifying the attributes collection
                // while iterating it.
                var controllerConventions =
                    controller.Attributes
                        .OfType<IControllerModelConvention>()
                        .ToArray();

                foreach (var controllerConvention in controllerConventions)
                {
                    controllerConvention.Apply(controller);
                }

                foreach (var action in controller.Actions)
                {
                    // ToArray is needed here to prevent issues with modifying the attributes collection
                    // while iterating it.
                    var actionConventions =
                        action.Attributes
                            .OfType<IActionModelConvention>()
                            .ToArray();

                    foreach (var actionConvention in actionConventions)
                    {
                        actionConvention.Apply(action);
                    }

                    foreach (var parameter in action.Parameters)
                    {
                        // ToArray is needed here to prevent issues with modifying the attributes collection
                        // while iterating it.
                        var parameterConventions =
                            parameter.Attributes
                                .OfType<IParameterModelConvention>()
                                .ToArray();

                        foreach (var parameterConvention in parameterConventions)
                        {
                            parameterConvention.Apply(parameter);
                        }
                    }
                }
            }
        }
コード例 #23
0
        public void ApplyConventions_RunsInOrderOfDecreasingScope()
        {
            // Arrange
            var sequence = 0;

            var applicationConvention = new Mock<IApplicationModelConvention>();
            applicationConvention
                .Setup(c => c.Apply(It.IsAny<ApplicationModel>()))
                .Callback(() => { Assert.Equal(0, sequence++); });

            var controllerConvention = new Mock<IControllerModelConvention>();
            controllerConvention
                .Setup(c => c.Apply(It.IsAny<ControllerModel>()))
                .Callback(() => { Assert.Equal(1, sequence++); });

            var actionConvention = new Mock<IActionModelConvention>();
            actionConvention
                .Setup(c => c.Apply(It.IsAny<ActionModel>()))
                .Callback(() => { Assert.Equal(2, sequence++); });

            var parameterConvention = new Mock<IParameterModelConvention>();
            parameterConvention
                .Setup(c => c.Apply(It.IsAny<ParameterModel>()))
                .Callback(() => { Assert.Equal(3, sequence++); });

            var options = new TestOptionsManager<MvcOptions>();
            options.Value.Conventions.Add(applicationConvention.Object);

            var applicationModel = new ApplicationModel();

            var controller = new ControllerModel(typeof(ConventionsController).GetTypeInfo(),
                                                 new List<object>() { controllerConvention.Object });
            controller.Application = applicationModel;
            applicationModel.Controllers.Add(controller);

            var methodInfo = typeof(ConventionsController).GetMethod("Create");
            var actionModel = new ActionModel(methodInfo, new List<object>() { actionConvention.Object });
            actionModel.Controller = controller;
            controller.Actions.Add(actionModel);

            var parameterInfo = actionModel.ActionMethod.GetParameters().Single();
            var parameterModel = new ParameterModel(parameterInfo,
                                           new List<object>() { parameterConvention.Object });
            parameterModel.Action = actionModel;
            actionModel.Parameters.Add(parameterModel);

            // Act
            ApplicationModelConventions.ApplyConventions(applicationModel, options.Value.Conventions);

            // Assert
            Assert.Equal(4, sequence);
        }
コード例 #24
0
 public void Apply(ApplicationModel application)
 {
     application.ApiExplorer.IsVisible = _isVisible;
 }