diff --git a/src/Microsoft.AspNet.Mvc.Abstractions/ModelBinding/OperationBindingContext.cs b/src/Microsoft.AspNet.Mvc.Abstractions/ModelBinding/OperationBindingContext.cs index cb422c7e49..1aa2ff74ec 100644 --- a/src/Microsoft.AspNet.Mvc.Abstractions/ModelBinding/OperationBindingContext.cs +++ b/src/Microsoft.AspNet.Mvc.Abstractions/ModelBinding/OperationBindingContext.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Collections.Generic; using Microsoft.AspNet.Http; using Microsoft.AspNet.Mvc.ModelBinding.Validation; @@ -22,6 +23,11 @@ namespace Microsoft.AspNet.Mvc.ModelBinding /// public HttpContext HttpContext { get; set; } + /// + /// Gets or sets the set of instances associated with this context. + /// + public IList InputFormatters { get; set; } + /// /// Gets unaltered value provider collection. /// Value providers can be filtered by specific model binders. diff --git a/src/Microsoft.AspNet.Mvc.Core/Controller.cs b/src/Microsoft.AspNet.Mvc.Core/Controller.cs index d2b51b1b8a..5d3ae6f43f 100644 --- a/src/Microsoft.AspNet.Mvc.Core/Controller.cs +++ b/src/Microsoft.AspNet.Mvc.Core/Controller.cs @@ -1050,6 +1050,7 @@ namespace Microsoft.AspNet.Mvc MetadataProvider, BindingContext.ModelBinder, valueProvider, + BindingContext.InputFormatters, ObjectValidator, BindingContext.ValidatorProvider); } @@ -1088,6 +1089,7 @@ namespace Microsoft.AspNet.Mvc MetadataProvider, BindingContext.ModelBinder, BindingContext.ValueProvider, + BindingContext.InputFormatters, ObjectValidator, BindingContext.ValidatorProvider, includeExpressions); @@ -1126,6 +1128,7 @@ namespace Microsoft.AspNet.Mvc MetadataProvider, BindingContext.ModelBinder, BindingContext.ValueProvider, + BindingContext.InputFormatters, ObjectValidator, BindingContext.ValidatorProvider, predicate); @@ -1167,6 +1170,7 @@ namespace Microsoft.AspNet.Mvc MetadataProvider, BindingContext.ModelBinder, valueProvider, + BindingContext.InputFormatters, ObjectValidator, BindingContext.ValidatorProvider, includeExpressions); @@ -1207,6 +1211,7 @@ namespace Microsoft.AspNet.Mvc MetadataProvider, BindingContext.ModelBinder, valueProvider, + BindingContext.InputFormatters, ObjectValidator, BindingContext.ValidatorProvider, predicate); @@ -1243,6 +1248,7 @@ namespace Microsoft.AspNet.Mvc MetadataProvider, BindingContext.ModelBinder, BindingContext.ValueProvider, + BindingContext.InputFormatters, ObjectValidator, BindingContext.ValidatorProvider); } @@ -1283,6 +1289,7 @@ namespace Microsoft.AspNet.Mvc MetadataProvider, BindingContext.ModelBinder, valueProvider, + BindingContext.InputFormatters, ObjectValidator, BindingContext.ValidatorProvider, predicate); diff --git a/src/Microsoft.AspNet.Mvc.Core/DefaultControllerActionArgumentBinder.cs b/src/Microsoft.AspNet.Mvc.Core/DefaultControllerActionArgumentBinder.cs index 7353482bf2..aacf99716e 100644 --- a/src/Microsoft.AspNet.Mvc.Core/DefaultControllerActionArgumentBinder.cs +++ b/src/Microsoft.AspNet.Mvc.Core/DefaultControllerActionArgumentBinder.cs @@ -209,6 +209,7 @@ namespace Microsoft.AspNet.Mvc { return new OperationBindingContext { + InputFormatters = bindingContext.InputFormatters, ModelBinder = bindingContext.ModelBinder, ValidatorProvider = bindingContext.ValidatorProvider, MetadataProvider = _modelMetadataProvider, diff --git a/src/Microsoft.AspNet.Mvc.Core/ModelBinding/BodyModelBinder.cs b/src/Microsoft.AspNet.Mvc.Core/ModelBinding/BodyModelBinder.cs index a8a4a36c61..8326ee316c 100644 --- a/src/Microsoft.AspNet.Mvc.Core/ModelBinding/BodyModelBinder.cs +++ b/src/Microsoft.AspNet.Mvc.Core/ModelBinding/BodyModelBinder.cs @@ -28,11 +28,8 @@ namespace Microsoft.AspNet.Mvc.ModelBinding protected async override Task BindModelCoreAsync( [NotNull] ModelBindingContext bindingContext) { - var requestServices = bindingContext.OperationBindingContext.HttpContext.RequestServices; - var httpContext = bindingContext.OperationBindingContext.HttpContext; - var formatters = requestServices - .GetRequiredService>().Value.InputFormatters; + var formatters = bindingContext.OperationBindingContext.InputFormatters; var formatterContext = new InputFormatterContext( httpContext, diff --git a/src/Microsoft.AspNet.Mvc.Core/ParameterBinding/ModelBindingHelper.cs b/src/Microsoft.AspNet.Mvc.Core/ParameterBinding/ModelBindingHelper.cs index 057f17c1c9..9d14dbf59a 100644 --- a/src/Microsoft.AspNet.Mvc.Core/ParameterBinding/ModelBindingHelper.cs +++ b/src/Microsoft.AspNet.Mvc.Core/ParameterBinding/ModelBindingHelper.cs @@ -35,6 +35,9 @@ namespace Microsoft.AspNet.Mvc /// The provider used for reading metadata for the model type. /// The used for binding. /// The used for looking up values. + /// + /// The set of instances for deserializing the body. + /// /// The used for validating the /// bound values. /// The used for executing validation @@ -48,6 +51,7 @@ namespace Microsoft.AspNet.Mvc [NotNull] IModelMetadataProvider metadataProvider, [NotNull] IModelBinder modelBinder, [NotNull] IValueProvider valueProvider, + [NotNull] IList inputFormatters, [NotNull] IObjectModelValidator objectModelValidator, [NotNull] IModelValidatorProvider validatorProvider) where TModel : class @@ -61,6 +65,7 @@ namespace Microsoft.AspNet.Mvc metadataProvider, modelBinder, valueProvider, + inputFormatters, objectModelValidator, validatorProvider, predicate: (context, propertyName) => true); @@ -81,6 +86,9 @@ namespace Microsoft.AspNet.Mvc /// The provider used for reading metadata for the model type. /// The used for binding. /// The used for looking up values. + /// + /// The set of instances for deserializing the body. + /// /// The used for validating the /// bound values. /// The used for executing validation @@ -97,6 +105,7 @@ namespace Microsoft.AspNet.Mvc [NotNull] IModelMetadataProvider metadataProvider, [NotNull] IModelBinder modelBinder, [NotNull] IValueProvider valueProvider, + [NotNull] IList inputFormatters, [NotNull] IObjectModelValidator objectModelValidator, [NotNull] IModelValidatorProvider validatorProvider, [NotNull] params Expression>[] includeExpressions) @@ -113,6 +122,7 @@ namespace Microsoft.AspNet.Mvc metadataProvider, modelBinder, valueProvider, + inputFormatters, objectModelValidator, validatorProvider, predicate: predicate); @@ -133,6 +143,9 @@ namespace Microsoft.AspNet.Mvc /// The provider used for reading metadata for the model type. /// The used for binding. /// The used for looking up values. + /// + /// The set of instances for deserializing the body. + /// /// The used for validating the /// bound values. /// The used for executing validation @@ -148,6 +161,7 @@ namespace Microsoft.AspNet.Mvc [NotNull] IModelMetadataProvider metadataProvider, [NotNull] IModelBinder modelBinder, [NotNull] IValueProvider valueProvider, + [NotNull] IList inputFormatters, [NotNull] IObjectModelValidator objectModelValidator, [NotNull] IModelValidatorProvider validatorProvider, [NotNull] Func predicate) @@ -162,6 +176,7 @@ namespace Microsoft.AspNet.Mvc metadataProvider, modelBinder, valueProvider, + inputFormatters, objectModelValidator, validatorProvider, predicate: predicate); @@ -182,6 +197,9 @@ namespace Microsoft.AspNet.Mvc /// The provider used for reading metadata for the model type. /// The used for binding. /// The used for looking up values. + /// + /// The set of instances for deserializing the body. + /// /// The used for validating the /// bound values. /// The used for executing validation @@ -196,6 +214,7 @@ namespace Microsoft.AspNet.Mvc [NotNull] IModelMetadataProvider metadataProvider, [NotNull] IModelBinder modelBinder, [NotNull] IValueProvider valueProvider, + [NotNull] IList inputFormatters, [NotNull] IObjectModelValidator objectModelValidator, [NotNull] IModelValidatorProvider validatorProvider) { @@ -209,6 +228,7 @@ namespace Microsoft.AspNet.Mvc metadataProvider, modelBinder, valueProvider, + inputFormatters, objectModelValidator, validatorProvider, predicate: (context, propertyName) => true); @@ -229,6 +249,9 @@ namespace Microsoft.AspNet.Mvc /// The provider used for reading metadata for the model type. /// The used for binding. /// The used for looking up values. + /// + /// The set of instances for deserializing the body. + /// /// The used for validating the /// bound values. /// The used for executing validation @@ -245,6 +268,7 @@ namespace Microsoft.AspNet.Mvc [NotNull] IModelMetadataProvider metadataProvider, [NotNull] IModelBinder modelBinder, [NotNull] IValueProvider valueProvider, + [NotNull] IList inputFormatters, [NotNull] IObjectModelValidator objectModelValidator, [NotNull] IModelValidatorProvider validatorProvider, [NotNull] Func predicate) @@ -264,6 +288,7 @@ namespace Microsoft.AspNet.Mvc var operationBindingContext = new OperationBindingContext { + InputFormatters = inputFormatters, ModelBinder = modelBinder, ValidatorProvider = validatorProvider, MetadataProvider = metadataProvider, diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/ModelBinding/BodyModelBinderTests.cs b/test/Microsoft.AspNet.Mvc.Core.Test/ModelBinding/BodyModelBinderTests.cs index 5239ae9735..9d867bd735 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/ModelBinding/BodyModelBinderTests.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/ModelBinding/BodyModelBinderTests.cs @@ -234,7 +234,10 @@ namespace Microsoft.AspNet.Mvc.ModelBinding httpContext = new DefaultHttpContext(); } - UpdateServiceProvider(httpContext, inputFormatters ?? Enumerable.Empty()); + if (inputFormatters == null) + { + inputFormatters = Enumerable.Empty(); + } if (metadataProvider == null) { @@ -243,6 +246,7 @@ namespace Microsoft.AspNet.Mvc.ModelBinding var operationBindingContext = new OperationBindingContext { + InputFormatters = inputFormatters.ToList(), ModelBinder = new BodyModelBinder(), MetadataProvider = metadataProvider, HttpContext = httpContext, @@ -261,26 +265,6 @@ namespace Microsoft.AspNet.Mvc.ModelBinding return bindingContext; } - private static void UpdateServiceProvider( - HttpContext httpContext, - IEnumerable inputFormatters) - { - var serviceProvider = new ServiceCollection(); - var bindingContext = new ActionBindingContext() - { - InputFormatters = inputFormatters.ToArray(), - }; - - var bindingContextAccessor = new MockScopedInstance() - { - Value = bindingContext, - }; - serviceProvider.AddInstance>(bindingContextAccessor); - serviceProvider.AddInstance(CreateActionContext(httpContext)); - - httpContext.RequestServices = serviceProvider.BuildServiceProvider(); - } - private static IScopedInstance CreateActionContext(HttpContext context) { return CreateActionContext(context, (new Mock()).Object); diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/ParameterBinding/ModelBindingHelperTest.cs b/test/Microsoft.AspNet.Mvc.Core.Test/ParameterBinding/ModelBindingHelperTest.cs index 69fb845978..6ce2d7ddd4 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/ParameterBinding/ModelBindingHelperTest.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/ParameterBinding/ModelBindingHelperTest.cs @@ -38,6 +38,7 @@ namespace Microsoft.AspNet.Mvc.Test metadataProvider, GetCompositeBinder(binder.Object), Mock.Of(), + new List(), new DefaultObjectValidator(new IExcludeTypeValidationFilter[0], metadataProvider), Mock.Of()); @@ -78,6 +79,7 @@ namespace Microsoft.AspNet.Mvc.Test modelMetadataProvider, GetCompositeBinder(binders), valueProvider, + new List(), new DefaultObjectValidator(new IExcludeTypeValidationFilter[0], modelMetadataProvider), validator); @@ -118,6 +120,7 @@ namespace Microsoft.AspNet.Mvc.Test metadataProvider, GetCompositeBinder(binders), valueProvider, + new List(), new DefaultObjectValidator(new IExcludeTypeValidationFilter[0], metadataProvider), validator); @@ -147,6 +150,7 @@ namespace Microsoft.AspNet.Mvc.Test metadataProvider, GetCompositeBinder(binder.Object), Mock.Of(), + new List(), Mock.Of(), Mock.Of(), includePredicate); @@ -202,6 +206,7 @@ namespace Microsoft.AspNet.Mvc.Test metadataProvider, GetCompositeBinder(binders), valueProvider, + new List(), new DefaultObjectValidator(new IExcludeTypeValidationFilter[0], metadataProvider), validator, includePredicate); @@ -233,6 +238,7 @@ namespace Microsoft.AspNet.Mvc.Test metadataProvider, GetCompositeBinder(binder.Object), Mock.Of(), + new List(), Mock.Of(), Mock.Of(), m => m.IncludedProperty ); @@ -284,6 +290,7 @@ namespace Microsoft.AspNet.Mvc.Test TestModelMetadataProvider.CreateDefaultProvider(), GetCompositeBinder(binders), valueProvider, + new List(), new DefaultObjectValidator(new IExcludeTypeValidationFilter[0], metadataProvider), validator, m => m.IncludedProperty, @@ -336,6 +343,7 @@ namespace Microsoft.AspNet.Mvc.Test metadataProvider, GetCompositeBinder(binders), valueProvider, + new List(), new DefaultObjectValidator(new IExcludeTypeValidationFilter[0], metadataProvider), validator); @@ -487,6 +495,7 @@ namespace Microsoft.AspNet.Mvc.Test metadataProvider: metadataProvider, modelBinder: GetCompositeBinder(binder.Object), valueProvider: Mock.Of(), + inputFormatters: new List(), objectModelValidator: Mock.Of(), validatorProvider: Mock.Of(), predicate: includePredicate); @@ -544,6 +553,7 @@ namespace Microsoft.AspNet.Mvc.Test metadataProvider, GetCompositeBinder(binders), valueProvider, + new List(), new DefaultObjectValidator( new IExcludeTypeValidationFilter[0], metadataProvider), @@ -578,6 +588,7 @@ namespace Microsoft.AspNet.Mvc.Test metadataProvider: metadataProvider, modelBinder: GetCompositeBinder(binder.Object), valueProvider: Mock.Of(), + inputFormatters: new List(), objectModelValidator: Mock.Of(), validatorProvider: Mock.Of()); @@ -618,6 +629,7 @@ namespace Microsoft.AspNet.Mvc.Test TestModelMetadataProvider.CreateDefaultProvider(), GetCompositeBinder(binders), valueProvider, + new List(), new DefaultObjectValidator( new IExcludeTypeValidationFilter[0], metadataProvider), @@ -652,6 +664,7 @@ namespace Microsoft.AspNet.Mvc.Test metadataProvider, GetCompositeBinder(binder.Object), Mock.Of(), + new List(), new DefaultObjectValidator( new IExcludeTypeValidationFilter[0], metadataProvider), diff --git a/test/Microsoft.AspNet.Mvc.IntegrationTests/BodyValidationIntegrationTests.cs b/test/Microsoft.AspNet.Mvc.IntegrationTests/BodyValidationIntegrationTests.cs index 532c85da01..e02a7120e0 100644 --- a/test/Microsoft.AspNet.Mvc.IntegrationTests/BodyValidationIntegrationTests.cs +++ b/test/Microsoft.AspNet.Mvc.IntegrationTests/BodyValidationIntegrationTests.cs @@ -49,11 +49,7 @@ namespace Microsoft.AspNet.Mvc.IntegrationTests request.ContentType = "application/json"; }); - var actionContext = operationContext - .HttpContext - .RequestServices - .GetRequiredService>().Value; - var modelState = actionContext.ModelState; + var modelState = new ModelStateDictionary(); // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext); @@ -140,9 +136,7 @@ namespace Microsoft.AspNet.Mvc.IntegrationTests request.ContentType = "application/json"; }); - var httpContext = operationContext.HttpContext; - var actionContext = httpContext.RequestServices.GetRequiredService>().Value; - var modelState = actionContext.ModelState; + var modelState = new ModelStateDictionary(); // Act var modelBindingResult = await argumentBinder.BindModelAsync(parameter, modelState, operationContext); diff --git a/test/Microsoft.AspNet.Mvc.IntegrationTests/ModelBindingTestHelper.cs b/test/Microsoft.AspNet.Mvc.IntegrationTests/ModelBindingTestHelper.cs index 10cb130843..76f2d124e0 100644 --- a/test/Microsoft.AspNet.Mvc.IntegrationTests/ModelBindingTestHelper.cs +++ b/test/Microsoft.AspNet.Mvc.IntegrationTests/ModelBindingTestHelper.cs @@ -41,6 +41,7 @@ namespace Microsoft.AspNet.Mvc.IntegrationTests { BodyBindingState = BodyBindingState.NotBodyBased, HttpContext = httpContext, + InputFormatters = actionBindingContext.InputFormatters, MetadataProvider = TestModelMetadataProvider.CreateDefaultProvider(), ValidatorProvider = actionBindingContext.ValidatorProvider, ValueProvider = actionBindingContext.ValueProvider, diff --git a/test/Microsoft.AspNet.Mvc.IntegrationTests/TryUpdateModelIntegrationTest.cs b/test/Microsoft.AspNet.Mvc.IntegrationTests/TryUpdateModelIntegrationTest.cs index 8c50faafe2..cc67c50c8d 100644 --- a/test/Microsoft.AspNet.Mvc.IntegrationTests/TryUpdateModelIntegrationTest.cs +++ b/test/Microsoft.AspNet.Mvc.IntegrationTests/TryUpdateModelIntegrationTest.cs @@ -576,6 +576,7 @@ namespace Microsoft.AspNet.Mvc.IntegrationTests operationContext.MetadataProvider, operationContext.ModelBinder, operationContext.ValueProvider, + operationContext.InputFormatters, ModelBindingTestHelper.GetObjectValidator(), operationContext.ValidatorProvider); }