public JsonWithFilesFormDataModelBinder(
     IOptions <MvcJsonOptions> jsonOptions,
     ILoggerFactory loggerFactory)
 {
     _jsonOptions         = jsonOptions;
     _formFileModelBinder = new FormFileModelBinder(loggerFactory);
 }
示例#2
0
    public async Task FormFileModelBinder_UsesFieldNameForTopLevelObject(bool isTopLevel, string expected)
    {
        // Arrange
        var formFiles = new FormFileCollection
        {
            GetMockFormFile("FieldName", "file1.txt"),
            GetMockFormFile("ModelName", "file1.txt")
        };
        var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles));

        var bindingContext = GetBindingContext(typeof(IFormFile), httpContext);

        bindingContext.IsTopLevelObject = isTopLevel;
        bindingContext.FieldName        = "FieldName";
        bindingContext.ModelName        = "ModelName";

        var binder = new FormFileModelBinder(NullLoggerFactory.Instance);

        // Act
        await binder.BindModelAsync(bindingContext);

        // Assert
        Assert.True(bindingContext.Result.IsModelSet);
        var file = Assert.IsAssignableFrom <IFormFile>(bindingContext.Result.Model);

        Assert.Equal(expected, file.Name);
    }
示例#3
0
    public async Task FormFileModelBinder_ReturnsResult_ForReadOnlyDestination()
    {
        // Arrange
        var binder         = new FormFileModelBinder(NullLoggerFactory.Instance);
        var formFiles      = GetTwoFiles();
        var httpContext    = GetMockHttpContext(GetMockFormCollection(formFiles));
        var bindingContext = GetBindingContextForReadOnlyArray(httpContext);

        // Act
        await binder.BindModelAsync(bindingContext);

        // Assert
        Assert.True(bindingContext.Result.IsModelSet);
        Assert.NotNull(bindingContext.Result.Model);
    }
示例#4
0
    public async Task FormFileModelBinder_ReturnsFailedResult_ForCollectionsItCannotCreate()
    {
        // Arrange
        var binder         = new FormFileModelBinder(NullLoggerFactory.Instance);
        var formFiles      = GetTwoFiles();
        var httpContext    = GetMockHttpContext(GetMockFormCollection(formFiles));
        var bindingContext = GetBindingContext(typeof(ISet <IFormFile>), httpContext);

        // Act
        await binder.BindModelAsync(bindingContext);

        // Assert
        Assert.False(bindingContext.Result.IsModelSet);
        Assert.Null(bindingContext.Result.Model);
    }
示例#5
0
    public async Task FormFileModelBinder_BindsFiles_ForCollectionsItCanCreate(Type destinationType)
    {
        // Arrange
        var binder         = new FormFileModelBinder(NullLoggerFactory.Instance);
        var formFiles      = GetTwoFiles();
        var httpContext    = GetMockHttpContext(GetMockFormCollection(formFiles));
        var bindingContext = GetBindingContext(destinationType, httpContext);

        // Act
        await binder.BindModelAsync(bindingContext);

        // Assert
        Assert.True(bindingContext.Result.IsModelSet);
        Assert.IsAssignableFrom(destinationType, bindingContext.Result.Model);
        Assert.Equal(formFiles, bindingContext.Result.Model as IEnumerable <IFormFile>);
    }
示例#6
0
    public async Task FormFileModelBinder_ExpectSingleFile_BindFirstFile()
    {
        // Arrange
        var formFiles      = GetTwoFiles();
        var httpContext    = GetMockHttpContext(GetMockFormCollection(formFiles));
        var bindingContext = GetBindingContext(typeof(IFormFile), httpContext);
        var binder         = new FormFileModelBinder(NullLoggerFactory.Instance);

        // Act
        await binder.BindModelAsync(bindingContext);

        // Assert
        Assert.True(bindingContext.Result.IsModelSet);
        var file = Assert.IsAssignableFrom <IFormFile>(bindingContext.Result.Model);

        Assert.Equal("file1.txt", file.FileName);
    }
示例#7
0
    public async Task FormFileModelBinder_ReturnsFailedResult_WithEmptyContentDisposition()
    {
        // Arrange
        var formFiles = new FormFileCollection
        {
            new Mock <IFormFile>().Object
        };
        var httpContext    = GetMockHttpContext(GetMockFormCollection(formFiles));
        var bindingContext = GetBindingContext(typeof(IFormFile), httpContext);
        var binder         = new FormFileModelBinder(NullLoggerFactory.Instance);

        // Act
        await binder.BindModelAsync(bindingContext);

        // Assert
        Assert.False(bindingContext.Result.IsModelSet);
        Assert.Null(bindingContext.Result.Model);
    }
示例#8
0
    public async Task FormFileModelBinder_ReturnsFailedResult_WhenNamesDoNotMatch()
    {
        // Arrange
        var formFiles = new FormFileCollection
        {
            GetMockFormFile("different name", "file1.txt")
        };
        var httpContext    = GetMockHttpContext(GetMockFormCollection(formFiles));
        var bindingContext = GetBindingContext(typeof(IFormFile), httpContext);
        var binder         = new FormFileModelBinder(NullLoggerFactory.Instance);

        // Act
        await binder.BindModelAsync(bindingContext);

        // Assert
        Assert.False(bindingContext.Result.IsModelSet);
        Assert.Null(bindingContext.Result.Model);
    }
示例#9
0
    public async Task FormFileModelBinder_ReturnsFailedResult_WithNoFileNameAndZeroLength()
    {
        // Arrange
        var formFiles = new FormFileCollection
        {
            GetMockFormFile("file", "")
        };
        var httpContext    = GetMockHttpContext(GetMockFormCollection(formFiles));
        var bindingContext = GetBindingContext(typeof(IFormFile), httpContext);
        var binder         = new FormFileModelBinder(NullLoggerFactory.Instance);

        // Act
        await binder.BindModelAsync(bindingContext);

        // Assert
        Assert.False(bindingContext.Result.IsModelSet);
        Assert.Null(bindingContext.Result.Model);
    }
示例#10
0
    public async Task FormFileModelBinder_SingleFileWithinTopLevelPoco_BindSuccessfully_WithShortenedModelName()
    {
        // Arrange
        const string propertyName = nameof(NestedFormFiles.Files);
        var          formFiles    = new FormFileCollection
        {
            GetMockFormFile($"FileList.{propertyName}", "file1.txt")
        };

        var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles));
        var binder      = new FormFileModelBinder(NullLoggerFactory.Instance);

        // Mimic ParameterBinder overwriting ModelName on top level model then ComplexTypeModelBinder entering a
        // nested context for the NestedFormFiles property. In this non-top-level binding case, FormFileModelBinder
        // tries ModelName then falls back to add an (OriginalModelName + ".") prefix.
        var propertyInfo = typeof(NestedFormFiles).GetProperty(propertyName);
        var metadata     = new EmptyModelMetadataProvider().GetMetadataForProperty(
            propertyInfo,
            propertyInfo.PropertyType);
        var bindingContext = DefaultModelBindingContext.CreateBindingContext(
            new ActionContext {
            HttpContext = httpContext
        },
            Mock.Of <IValueProvider>(),
            metadata,
            bindingInfo: null,
            modelName: "FileList");

        bindingContext.IsTopLevelObject = false;
        bindingContext.Model            = new FileList();
        bindingContext.ModelName        = propertyName;

        // Act
        await binder.BindModelAsync(bindingContext);

        // Assert
        Assert.True(bindingContext.Result.IsModelSet);

        var entry = bindingContext.ValidationState[bindingContext.Result.Model];

        Assert.False(entry.SuppressValidation);
        Assert.Equal($"FileList.{propertyName}", entry.Key);
        Assert.Null(entry.Metadata);
    }
示例#11
0
    public async Task FormFileModelBinder_SingleFileWithinTopLevelPoco_BindSuccessfully()
    {
        // Arrange
        const string propertyName = nameof(NestedFormFiles.Files);
        var          formFiles    = new FormFileCollection
        {
            GetMockFormFile($"{propertyName}", "file1.txt")
        };

        var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles));
        var binder      = new FormFileModelBinder(NullLoggerFactory.Instance);

        // In this non-top-level binding case, FormFileModelBinder tries ModelName and succeeds.
        var propertyInfo = typeof(NestedFormFiles).GetProperty(propertyName);
        var metadata     = new EmptyModelMetadataProvider().GetMetadataForProperty(
            propertyInfo,
            propertyInfo.PropertyType);
        var bindingContext = DefaultModelBindingContext.CreateBindingContext(
            new ActionContext {
            HttpContext = httpContext
        },
            Mock.Of <IValueProvider>(),
            metadata,
            bindingInfo: null,
            modelName: "FileList");

        bindingContext.IsTopLevelObject = false;
        bindingContext.Model            = new FileList();
        bindingContext.ModelName        = propertyName;

        // Act
        await binder.BindModelAsync(bindingContext);

        // Assert
        Assert.True(bindingContext.Result.IsModelSet);

        var entry = bindingContext.ValidationState[bindingContext.Result.Model];

        Assert.False(entry.SuppressValidation);
        Assert.Equal($"{propertyName}", entry.Key);
        Assert.Null(entry.Metadata);
    }
示例#12
0
    public async Task FormFileModelBinder_SingleFileWithinTopLevelDictionary_BindSuccessfully_WithShortenedModelName()
    {
        // Arrange
        var formFiles = new FormFileCollection
        {
            GetMockFormFile("FileDictionary[myFile]", "file1.txt")
        };

        var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles));
        var binder      = new FormFileModelBinder(NullLoggerFactory.Instance);

        // Mimic ParameterBinder overwriting ModelName on top level model then DictionaryModelBinder entering a
        // nested context for the KeyValuePair.Value property. In this non-top-level binding case,
        // FormFileModelBinder tries ModelName then falls back to add an OriginalModelName prefix.
        var bindingContext = DefaultModelBindingContext.CreateBindingContext(
            new ActionContext {
            HttpContext = httpContext
        },
            Mock.Of <IValueProvider>(),
            new EmptyModelMetadataProvider().GetMetadataForType(typeof(IFormFile)),
            bindingInfo: null,
            modelName: "FileDictionary");

        bindingContext.IsTopLevelObject = false;
        bindingContext.ModelName        = "[myFile]";

        // Act
        await binder.BindModelAsync(bindingContext);

        // Assert
        Assert.True(bindingContext.Result.IsModelSet);

        var entry = bindingContext.ValidationState[bindingContext.Result.Model];

        Assert.False(entry.SuppressValidation);
        Assert.Equal("FileDictionary[myFile]", entry.Key);
        Assert.Null(entry.Metadata);
    }
示例#13
0
    public async Task FormFileModelBinder_SingleFile_BindSuccessful()
    {
        // Arrange
        var formFiles = new FormFileCollection
        {
            GetMockFormFile("file", "file1.txt")
        };
        var httpContext    = GetMockHttpContext(GetMockFormCollection(formFiles));
        var bindingContext = GetBindingContext(typeof(IEnumerable <IFormFile>), httpContext);
        var binder         = new FormFileModelBinder(NullLoggerFactory.Instance);

        // Act
        await binder.BindModelAsync(bindingContext);

        // Assert
        Assert.True(bindingContext.Result.IsModelSet);

        var entry = bindingContext.ValidationState[bindingContext.Result.Model];

        Assert.False(entry.SuppressValidation);
        Assert.Equal("file", entry.Key);
        Assert.Null(entry.Metadata);
    }
示例#14
0
    public async Task FormFileModelBinder_ExpectMultipleFiles_BindSuccessful()
    {
        // Arrange
        var formFiles      = GetTwoFiles();
        var httpContext    = GetMockHttpContext(GetMockFormCollection(formFiles));
        var bindingContext = GetBindingContext(typeof(IEnumerable <IFormFile>), httpContext);
        var binder         = new FormFileModelBinder(NullLoggerFactory.Instance);

        // Act
        await binder.BindModelAsync(bindingContext);

        // Assert
        Assert.True(bindingContext.Result.IsModelSet);

        var entry = bindingContext.ValidationState[bindingContext.Result.Model];

        Assert.False(entry.SuppressValidation);
        Assert.Equal("file", entry.Key);
        Assert.Null(entry.Metadata);

        var files = Assert.IsAssignableFrom <IList <IFormFile> >(bindingContext.Result.Model);

        Assert.Equal(2, files.Count);
    }
示例#15
0
    public async Task FormFileModelBinder_SingleFileWithinTopLevelDictionary_BindSuccessfully()
    {
        // Arrange
        var formFiles = new FormFileCollection
        {
            GetMockFormFile("[myFile]", "file1.txt")
        };

        var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles));
        var binder      = new FormFileModelBinder(NullLoggerFactory.Instance);

        // In this non-top-level binding case, FormFileModelBinder tries ModelName and succeeds.
        var bindingContext = DefaultModelBindingContext.CreateBindingContext(
            new ActionContext {
            HttpContext = httpContext
        },
            Mock.Of <IValueProvider>(),
            new EmptyModelMetadataProvider().GetMetadataForType(typeof(IFormFile)),
            bindingInfo: null,
            modelName: "FileDictionary");

        bindingContext.IsTopLevelObject = false;
        bindingContext.ModelName        = "[myFile]";

        // Act
        await binder.BindModelAsync(bindingContext);

        // Assert
        Assert.True(bindingContext.Result.IsModelSet);

        var entry = bindingContext.ValidationState[bindingContext.Result.Model];

        Assert.False(entry.SuppressValidation);
        Assert.Equal("[myFile]", entry.Key);
        Assert.Null(entry.Metadata);
    }
示例#16
0
    public async Task FormFileModelBinder_SingleFileAtTopLevel_BindSuccessfully_WithEmptyModelName()
    {
        // Arrange
        var formFiles = new FormFileCollection
        {
            GetMockFormFile("file", "file1.txt")
        };

        var httpContext = GetMockHttpContext(GetMockFormCollection(formFiles));
        var binder      = new FormFileModelBinder(NullLoggerFactory.Instance);

        // Mimic ParameterBinder overwriting ModelName on top level model. In this top-level binding case,
        // FormFileModelBinder uses FieldName from the get-go. (OriginalModelName will be checked but ignored.)
        var bindingContext = DefaultModelBindingContext.CreateBindingContext(
            new ActionContext {
            HttpContext = httpContext
        },
            Mock.Of <IValueProvider>(),
            new EmptyModelMetadataProvider().GetMetadataForType(typeof(IFormFile)),
            bindingInfo: null,
            modelName: "file");

        bindingContext.ModelName = string.Empty;

        // Act
        await binder.BindModelAsync(bindingContext);

        // Assert
        Assert.True(bindingContext.Result.IsModelSet);

        var entry = bindingContext.ValidationState[bindingContext.Result.Model];

        Assert.False(entry.SuppressValidation);
        Assert.Equal("file", entry.Key);
        Assert.Null(entry.Metadata);
    }
 public CustomModelBinding(IOptions <MvcJsonOptions> jsonOptions)
 {
     _jsonOptions         = jsonOptions;
     _formFileModelBinder = new FormFileModelBinder();
 }
示例#18
0
 public FormFileWithJsonModelBinder(IOptions <MvcNewtonsoftJsonOptions> jsonOptions, ILoggerFactory loggerFactory)
 {
     _jsonOptions         = jsonOptions;
     _formFileModelBinder = new FormFileModelBinder(loggerFactory);
 }
示例#19
0
 public JsonFormFileModelBinder(ILoggerFactory loggerFactory)
 {
     _formFileModelBinder = new FormFileModelBinder(loggerFactory);
 }
 public JsonWithFilesFormDataModelBinder(ILoggerFactory loggerFactory)
 {
     _jsonOptions         = new MvcJsonOptions();
     _formFileModelBinder = new FormFileModelBinder(loggerFactory);
 }
示例#21
0
 public FileFormDataModelBinder()
 {
     formFileModelBinder = new FormFileModelBinder(null);
 }
 public JSONWithFilesMultiPartModelBinder(IOptions <MvcJsonOptions> jsonOptions, ILoggerFactory loggerFactory)
 {
     _jsonOptions         = jsonOptions;
     _formFileModelBinder = new FormFileModelBinder(loggerFactory);
 }
 public JsonWithFilesFormDataModelBinder(ILoggerFactory loggerFactory)
 {
     _formFileModelBinder = new FormFileModelBinder(loggerFactory);
 }
 public JsonWithFilesFormDataModelBinder(IOptions <MvcJsonOptions> jsonOptions, FormFileModelBinder formFileModelBinder)
 {
     _jsonOptions         = jsonOptions;
     _formFileModelBinder = formFileModelBinder;
 }
示例#25
0
 public FulltaskInfoBinder(IOptions <MvcJsonOptions> jsonOptions, ILoggerFactory loggerFactory)
 {
     _jsonOptions         = jsonOptions;
     _formFileModelBinder = new FormFileModelBinder();
 }
示例#26
0
 public JsonAndFileModelBinder(ILoggerFactory loggerFactory)
 {
     _loggerFactory       = loggerFactory;
     _formFileModelBinder = new FormFileModelBinder(_loggerFactory);
 }
示例#27
0
 public JsonWithFilesFormDataModelBinder(IOptions <JsonSerializerSettings> jsonOptions, ILoggerFactory loggerFactory)
 {
     this.jsonOptions         = jsonOptions;
     this.formFileModelBinder = new FormFileModelBinder(loggerFactory);
 }