diff --git a/src/Microsoft.AspNetCore.Mvc.Core/Internal/MvcCoreMvcOptionsSetup.cs b/src/Microsoft.AspNetCore.Mvc.Core/Internal/MvcCoreMvcOptionsSetup.cs index 74fa4b9914..830aeeb7f6 100644 --- a/src/Microsoft.AspNetCore.Mvc.Core/Internal/MvcCoreMvcOptionsSetup.cs +++ b/src/Microsoft.AspNetCore.Mvc.Core/Internal/MvcCoreMvcOptionsSetup.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.IO; using System.Threading; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.Formatters; @@ -79,6 +80,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(CancellationToken))); options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(IFormFile))); options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(IFormCollection))); + options.ModelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(Stream))); } } } \ No newline at end of file diff --git a/test/Microsoft.AspNetCore.Mvc.Core.Test/Internal/DefaultObjectValidatorTests.cs b/test/Microsoft.AspNetCore.Mvc.Core.Test/Internal/DefaultObjectValidatorTests.cs index dd664c7aac..3151a241c2 100644 --- a/test/Microsoft.AspNetCore.Mvc.Core.Test/Internal/DefaultObjectValidatorTests.cs +++ b/test/Microsoft.AspNetCore.Mvc.Core.Test/Internal/DefaultObjectValidatorTests.cs @@ -4,7 +4,9 @@ using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.IO; using System.Linq; +using System.Text; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ModelBinding.Metadata; @@ -1066,6 +1068,31 @@ namespace Microsoft.AspNetCore.Mvc.Internal Assert.Empty(entry.Errors); } + [Fact] + public void Validate_SuppressesValidation_ForExcludedType_Stream() + { + // Arrange + var options = new MvcOptions(); + var optionsSetup = new MvcCoreMvcOptionsSetup(Mock.Of()); + optionsSetup.Configure(options); + var validator = CreateValidator(providers: options.ModelMetadataDetailsProviders.ToArray()); + var model = new MemoryStream(Encoding.UTF8.GetBytes("Hello!")); + var actionContext = new ActionContext(); + var modelState = actionContext.ModelState; + modelState.SetModelValue("parameter", rawValue: null, attemptedValue: null); + var validationState = new ValidationStateDictionary(); + validationState.Add(model, new ValidationStateEntry() { Key = "parameter" }); + + // Act + validator.Validate(actionContext, validationState, "parameter", model); + + // Assert + Assert.True(modelState.IsValid); + var entry = Assert.Single(modelState); + Assert.Equal(ModelValidationState.Valid, entry.Value.ValidationState); + Assert.Empty(entry.Value.Errors); + } + private static DefaultObjectValidator CreateValidator(Type excludedType) { var excludeFilters = new List(); diff --git a/test/Microsoft.AspNetCore.Mvc.Test/MvcOptionsSetupTest.cs b/test/Microsoft.AspNetCore.Mvc.Test/MvcOptionsSetupTest.cs index 5f36d0b9b9..69450a51c3 100644 --- a/test/Microsoft.AspNetCore.Mvc.Test/MvcOptionsSetupTest.cs +++ b/test/Microsoft.AspNetCore.Mvc.Test/MvcOptionsSetupTest.cs @@ -3,6 +3,7 @@ using System; using System.Diagnostics; +using System.IO; using System.Linq; using System.Reflection; using System.Threading; @@ -185,6 +186,11 @@ namespace Microsoft.AspNetCore.Mvc var excludeFilter = Assert.IsType(provider); Assert.Equal(typeof(IFormCollection), excludeFilter.Type); }, + provider => + { + var excludeFilter = Assert.IsType(provider); + Assert.Equal(typeof(Stream), excludeFilter.Type); + }, provider => Assert.IsType(provider), provider => {