public void GetModelBinderFactory_ReturnsNullIfPageModelHasNoBoundProperties() { // Arrange var actionDescriptor = new CompiledPageActionDescriptor { PageTypeInfo = typeof(PageWithNoBoundProperties).GetTypeInfo(), ModelTypeInfo = typeof(PageModelWithNoBoundProperties).GetTypeInfo(), }; var modelMetadataProvider = TestModelMetadataProvider.CreateDefaultProvider(); var modelBinderFactory = TestModelBinderFactory.CreateDefault(); var binder = new ParameterBinder( modelMetadataProvider, modelBinderFactory, Mock.Of <IObjectModelValidator>(), _optionsAccessor, NullLoggerFactory.Instance); // Act var factory = PageBinderFactory.CreatePropertyBinder(binder, modelMetadataProvider, modelBinderFactory, actionDescriptor); // Assert Assert.Same(PageBinderFactory.NullPropertyBinder, factory); }
private static ControllerActionInvokerCache CreateControllerActionInvokerCache( ControllerContext controllerContext, IFilterProvider[] filterProviders) { var descriptorProvider = new CustomActionDescriptorCollectionProvider( new[] { controllerContext.ActionDescriptor }); var modelMetadataProvider = new EmptyModelMetadataProvider(); var modelBinderFactory = TestModelBinderFactory.CreateDefault(); var mvcOptions = Options.Create(new MvcOptions()); return(new ControllerActionInvokerCache( descriptorProvider, new ParameterBinder( modelMetadataProvider, modelBinderFactory, Mock.Of <IObjectModelValidator>(), mvcOptions, NullLoggerFactory.Instance), modelBinderFactory, modelMetadataProvider, filterProviders, Mock.Of <IControllerFactoryProvider>(), mvcOptions)); }
public async Task CreateHandlerBinder_SkipBindingParametersThatDisallowBinding() { // Arrange var type = typeof(PageModelWithExecutors); var actionDescriptor = GetActionDescriptorWithHandlerMethod(type, nameof(PageModelWithExecutors.OnGetWithBindNever)); // Act var parameterBinder = new TestParameterBinder(new Dictionary <string, object>() { { "id", "value" }, }); var modelMetadataProvider = TestModelMetadataProvider.CreateDefaultProvider(); var modelBinderFactory = TestModelBinderFactory.CreateDefault(); var factory = PageBinderFactory.CreateHandlerBinder( parameterBinder, modelMetadataProvider, modelBinderFactory, actionDescriptor, actionDescriptor.HandlerMethods[0]); var page = new PageWithProperty { PageContext = GetPageContext() }; var model = new PageModelWithExecutors(); var arguments = new Dictionary <string, object>(); // Act await factory(page.PageContext, arguments); // Assert Assert.Empty(arguments); }
public async Task ModelBinderFactory_BindsPropertyWithoutSupportsGet_WhenRequestIsNotGet() { // Arrange var type = typeof(PageModelWithSupportsGetProperty).GetTypeInfo(); var actionDescriptor = new CompiledPageActionDescriptor { BoundProperties = new[] { new PageBoundPropertyDescriptor() { Name = nameof(PageModelWithSupportsGetProperty.SupportsGet), ParameterType = typeof(string), Property = type.GetProperty(nameof(PageModelWithSupportsGetProperty.SupportsGet)), BindingInfo = new BindingInfo() { RequestPredicate = ((IRequestPredicateProvider) new BindPropertyAttribute() { SupportsGet = true }).RequestPredicate, } }, new PageBoundPropertyDescriptor() { Name = nameof(PageModelWithSupportsGetProperty.Default), ParameterType = typeof(string), Property = type.GetProperty(nameof(PageModelWithSupportsGetProperty.Default)), }, }, HandlerTypeInfo = type, PageTypeInfo = typeof(PageWithProperty).GetTypeInfo(), ModelTypeInfo = type, }; var binder = new TestParameterBinder(new Dictionary <string, object>() { { "SupportsGet", "value" }, { "Default", "value" }, }); var modelMetadataProvider = TestModelMetadataProvider.CreateDefaultProvider(); var modelBinderFactory = TestModelBinderFactory.CreateDefault(); var factory = PageBinderFactory.CreatePropertyBinder(binder, modelMetadataProvider, modelBinderFactory, actionDescriptor); var page = new PageWithProperty { PageContext = GetPageContext() }; page.HttpContext.Request.Method = "Post"; var model = new PageModelWithSupportsGetProperty(); // Act await factory(page.PageContext, model); // Assert Assert.Equal("value", model.SupportsGet); Assert.Equal("value", model.Default); }
public async Task ModelBinderFactory_BindsPropertiesOnPageModel() { // Arrange var type = typeof(PageModelWithProperty).GetTypeInfo(); var actionDescriptor = new CompiledPageActionDescriptor { BoundProperties = new[] { new PageBoundPropertyDescriptor() { Name = nameof(PageModelWithProperty.Id), ParameterType = typeof(int), Property = type.GetProperty(nameof(PageModelWithProperty.Id)), }, new PageBoundPropertyDescriptor() { Name = nameof(PageModelWithProperty.RouteDifferentValue), ParameterType = typeof(string), Property = type.GetProperty(nameof(PageModelWithProperty.RouteDifferentValue)), }, new PageBoundPropertyDescriptor() { Name = nameof(PageModelWithProperty.PropertyWithNoValue), ParameterType = typeof(string), Property = type.GetProperty(nameof(PageModelWithProperty.PropertyWithNoValue)), } }, HandlerTypeInfo = typeof(PageModelWithProperty).GetTypeInfo(), PageTypeInfo = typeof(PageWithProperty).GetTypeInfo(), ModelTypeInfo = typeof(PageModelWithProperty).GetTypeInfo(), }; var binder = new TestParameterBinder(new Dictionary <string, object> { { nameof(PageModelWithProperty.Id), 10 }, { nameof(PageModelWithProperty.RouteDifferentValue), "route-value" } }); var modelMetadataProvider = TestModelMetadataProvider.CreateDefaultProvider(); var modelBinderFactory = TestModelBinderFactory.CreateDefault(); var factory = PageBinderFactory.CreatePropertyBinder(binder, modelMetadataProvider, modelBinderFactory, actionDescriptor); var page = new PageWithProperty { PageContext = GetPageContext() }; var model = new PageModelWithProperty(); // Act await factory(page.PageContext, model); // Assert // Verify that the page properties were not bound. Assert.Equal(default(int), page.Id); Assert.Null(page.RouteDifferentValue); Assert.Equal(10, model.Id); Assert.Equal("route-value", model.RouteDifferentValue); Assert.Null(model.PropertyWithNoValue); }
public async Task MultipleActionParameter_ValidModelState(List <ParameterDescriptor> parameters) { // Since validation attribute is only present on the FromBody model's property(TransferInfo's AccountId), // validation should not trigger for the parameter which is bound from Uri. // Arrange var actionDescriptor = new ControllerActionDescriptor() { BoundProperties = new List <ParameterDescriptor>(), Parameters = parameters }; var modelMetadataProvider = new EmptyModelMetadataProvider(); var modelBinderProvider = new BodyModelBinderProvider(new[] { Mock.Of <IInputFormatter>() }, Mock.Of <IHttpRequestStreamReaderFactory>()); var factory = TestModelBinderFactory.CreateDefault(modelBinderProvider); var parameterBinder = new Mock <ParameterBinder>( new EmptyModelMetadataProvider(), factory, CreateMockValidator()); parameterBinder.Setup(p => p.BindModelAsync( It.IsAny <ActionContext>(), It.IsAny <IModelBinder>(), It.IsAny <IValueProvider>(), It.IsAny <ParameterDescriptor>(), It.IsAny <ModelMetadata>(), null)) .Returns((ActionContext context, IModelBinder modelBinder, IValueProvider valueProvider, ParameterDescriptor descriptor, ModelMetadata metadata, object v) => { ModelBindingResult result; if (descriptor.Name == "accountId") { result = ModelBindingResult.Success(10); } else if (descriptor.Name == "transferInfo") { result = ModelBindingResult.Success(new TransferInfo { AccountId = 40, Amount = 250.0 }); } else { result = ModelBindingResult.Failed(); } return(Task.FromResult(result)); }); var controllerContext = new ControllerContext { ActionDescriptor = actionDescriptor, }; var arguments = new Dictionary <string, object>(StringComparer.Ordinal); var modelState = controllerContext.ModelState; // Act var binderDelegate = ControllerBinderDelegateProvider.CreateBinderDelegate( parameterBinder.Object, factory, TestModelMetadataProvider.CreateDefaultProvider(), actionDescriptor); await binderDelegate(controllerContext, new TestController(), arguments); // Assert Assert.True(modelState.IsValid); Assert.True(arguments.TryGetValue("accountId", out var value)); var accountId = Assert.IsType <int>(value); Assert.Equal(10, accountId); Assert.True(arguments.TryGetValue("transferInfo", out value)); var transferInfo = Assert.IsType <TransferInfo>(value); Assert.NotNull(transferInfo); Assert.Equal(40, transferInfo.AccountId); Assert.Equal(250.0, transferInfo.Amount); }