[Fixes #5154] Stream should be suppressed from model metadata validation

This commit is contained in:
Kiran Challa 2016-09-13 15:31:09 -07:00
parent 3c05d10430
commit 01f7ecd9d9
3 changed files with 35 additions and 0 deletions

View File

@ -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)));
}
}
}

View File

@ -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<IHttpRequestStreamReaderFactory>());
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<SuppressChildValidationMetadataProvider>();

View File

@ -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<SuppressChildValidationMetadataProvider>(provider);
Assert.Equal(typeof(IFormCollection), excludeFilter.Type);
},
provider =>
{
var excludeFilter = Assert.IsType<SuppressChildValidationMetadataProvider>(provider);
Assert.Equal(typeof(Stream), excludeFilter.Type);
},
provider => Assert.IsType<DataAnnotationsMetadataProvider>(provider),
provider =>
{