上载文件并传递模型数据

时间:2019-06-05 17:32:21

标签: c# asp.net-web-api postman

我需要导入文件,以及下面显示的color: var(--input-custom-color);模型。

我能够上载文件,但是,我无法通过我编写的Person方法检索Person模型数据。

注意:我正在通过邮递员测试此Web API。如何上传文件,并通过邮递员发送importFileAndOtherInfo模型数据?

Person

我的实现:

int pId
string PName
School schoolAttended

1 个答案:

答案 0 :(得分:0)

我从您的问题中了解到,您想同时传递模型数据和文件流;您不能直接发送它,方法是使用IFormFile发送文件并添加创建自己的模型装订器,如下所示,

public class JsonWithFilesFormDataModelBinder: IModelBinder
{
    private readonly IOptions<MvcJsonOptions> _jsonOptions;
    private readonly FormFileModelBinder _formFileModelBinder;

    public JsonWithFilesFormDataModelBinder(IOptions<MvcJsonOptions> jsonOptions, ILoggerFactory loggerFactory)
    {
        _jsonOptions = jsonOptions;
        _formFileModelBinder = new FormFileModelBinder(loggerFactory);
    }

    public async Task BindModelAsync(ModelBindingContext bindingContext)
    {
        if (bindingContext == null)
            throw new ArgumentNullException(nameof(bindingContext));

        // Retrieve the form part containing the JSON
        var valueResult = bindingContext.ValueProvider.GetValue(bindingContext.FieldName);
        if (valueResult == ValueProviderResult.None)
        {
            // The JSON was not found
            var message = bindingContext.ModelMetadata.ModelBindingMessageProvider.MissingBindRequiredValueAccessor(bindingContext.FieldName);
            bindingContext.ModelState.TryAddModelError(bindingContext.ModelName, message);
            return;
        }

        var rawValue = valueResult.FirstValue;

        // Deserialize the JSON
        var model = JsonConvert.DeserializeObject(rawValue, bindingContext.ModelType, _jsonOptions.Value.SerializerSettings);

        // Now, bind each of the IFormFile properties from the other form parts
        foreach (var property in bindingContext.ModelMetadata.Properties)
        {
            if (property.ModelType != typeof(IFormFile))
                continue;

            var fieldName = property.BinderModelName ?? property.PropertyName;
            var modelName = fieldName;
            var propertyModel = property.PropertyGetter(bindingContext.Model);
            ModelBindingResult propertyResult;
            using (bindingContext.EnterNestedScope(property, fieldName, modelName, propertyModel))
            {
                await _formFileModelBinder.BindModelAsync(bindingContext);
                propertyResult = bindingContext.Result;
            }

            if (propertyResult.IsModelSet)
            {
                // The IFormFile was successfully bound, assign it to the corresponding property of the model
                property.PropertySetter(model, propertyResult.Model);
            }
            else if (property.IsBindingRequired)
            {
                var message = property.ModelBindingMessageProvider.MissingBindRequiredValueAccessor(fieldName);
                bindingContext.ModelState.TryAddModelError(modelName, message);
            }
        }

        // Set the successfully constructed model as the result of the model binding
        bindingContext.Result = ModelBindingResult.Success(model);
    }
} 

型号

[ModelBinder(typeof(JsonWithFilesFormDataModelBinder), Name = "data")]
public class Person
{
   public int pId {get; set;}
   public string PName {get; set;}
   public School schoolAttended {get; set;}
   public IFormFile File { get; set; }
}

邮递员请求:

enter image description here