Infer BindingSource.FormFile for IEnumerable<IFormFile>

Fixes #7770
This commit is contained in:
Pranav K 2018-05-21 18:14:54 -07:00
parent 077b1d87a9
commit 49c653ed0b
3 changed files with 61 additions and 0 deletions

View File

@ -96,6 +96,7 @@ namespace Microsoft.AspNetCore.Mvc.Internal
modelMetadataDetailsProviders.Add(new BindingSourceMetadataProvider(typeof(IFormFile), BindingSource.FormFile));
modelMetadataDetailsProviders.Add(new BindingSourceMetadataProvider(typeof(IFormCollection), BindingSource.FormFile));
modelMetadataDetailsProviders.Add(new BindingSourceMetadataProvider(typeof(IFormFileCollection), BindingSource.FormFile));
modelMetadataDetailsProviders.Add(new BindingSourceMetadataProvider(typeof(IEnumerable<IFormFile>), BindingSource.FormFile));
// Add types to be excluded from Validation
modelMetadataDetailsProviders.Add(new SuppressChildValidationMetadataProvider(typeof(Type)));

View File

@ -211,6 +211,52 @@ namespace Microsoft.AspNetCore.Mvc.Internal
});
}
[Fact]
public void OnProvidersExecuting_InfersFormFileSourceForTypesAssignableFromIEnumerableOfFormFiles()
{
// Arrange
var builder = new TestApplicationModelProvider(
new MvcOptions { AllowValidatingTopLevelNodes = true },
TestModelMetadataProvider.CreateDefaultProvider());
var typeInfo = typeof(ModelBinderController).GetTypeInfo();
var context = new ApplicationModelProviderContext(new[] { typeInfo });
// Act
builder.OnProvidersExecuting(context);
// Assert
var controllerModel = Assert.Single(context.Result.Controllers);
var action = Assert.Single(controllerModel.Actions, a => a.ActionMethod.Name == nameof(ModelBinderController.FormFilesSequences));
Assert.Collection(
action.Parameters,
parameter =>
{
Assert.Equal("formFileEnumerable", parameter.ParameterName);
Assert.Equal(BindingSource.FormFile, parameter.BindingInfo.BindingSource);
},
parameter =>
{
Assert.Equal("formFileCollection", parameter.ParameterName);
Assert.Equal(BindingSource.FormFile, parameter.BindingInfo.BindingSource);
},
parameter =>
{
Assert.Equal("formFileIList", parameter.ParameterName);
Assert.Equal(BindingSource.FormFile, parameter.BindingInfo.BindingSource);
},
parameter =>
{
Assert.Equal("formFileList", parameter.ParameterName);
Assert.Equal(BindingSource.FormFile, parameter.BindingInfo.BindingSource);
},
parameter =>
{
Assert.Equal("formFileArray", parameter.ParameterName);
Assert.Equal(BindingSource.FormFile, parameter.BindingInfo.BindingSource);
});
}
[Fact]
public void OnProvidersExecuting_AddsBindingSources_ForActionParameters_ReadFromModelMetadata()
{
@ -1625,6 +1671,13 @@ namespace Microsoft.AspNetCore.Mvc.Internal
public IActionResult PostAction([FromQuery] string fromQuery, IFormFileCollection formFileCollection, string unbound) => null;
public IActionResult FormFilesSequences(
IEnumerable<IFormFile> formFileEnumerable,
ICollection<IFormFile> formFileCollection,
IList<IFormFile> formFileIList,
List<IFormFile> formFileList,
IFormFile[] formFileArray) => null;
public IActionResult PostAction1(Guid guid) => null;
public IActionResult PostAction2([FromQuery] Guid fromQuery) => null;

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.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
@ -189,6 +190,12 @@ namespace Microsoft.AspNetCore.Mvc
Assert.Equal(BindingSource.FormFile, formFileParameter.BindingSource);
},
provider =>
{
var formFileParameter = Assert.IsType<BindingSourceMetadataProvider>(provider);
Assert.Equal(typeof(IEnumerable<IFormFile>), formFileParameter.Type);
Assert.Equal(BindingSource.FormFile, formFileParameter.BindingSource);
},
provider =>
{
var excludeFilter = Assert.IsType<SuppressChildValidationMetadataProvider>(provider);
Assert.Equal(typeof(Type), excludeFilter.Type);