我有一个控制器方法来接受多部分/表单-数据请求,其基本类型为对象的File和List。我发现当我使用FromForm处理复杂的数据类型时,我需要定制模型绑定器,于是我做了一个,但问题是绑定在Swagger中有效,而在Postman中无效。
下面是我的控制器方法:
public async Task<IActionResult> Post([FromForm] AddRequest addRequest)
{
var result = await _service.AddAsync(addRequest);
if (result.Success)
{
return Ok(result);
}
return BadRequest();
}
我的请求如下所示:
public class AddRequest
{
public string? Name { get; set; }
public string? Description { get; set;}
public IFormFile? File { get; set; }
public IEnumerable<LocaleViewModel>? Locales { get; set; }
}
这是我的视图模型:
[ModelBinder(BinderType = typeof(MetadataValueModelBinder))]
public class LocaleViewModel
{
public long Id { get; set; }
public string Code { get; set; }
}
最后是模型活页夹:
public class MetadataValueModelBinder : IModelBinder
{
public Task BindModelAsync(ModelBindingContext bindingContext)
{
if (bindingContext == null)
throw new ArgumentNullException(nameof(bindingContext));
var values = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
if (values.Length == 0)
return Task.CompletedTask;
var options = new JsonSerializerOptions() { PropertyNameCaseInsensitive = true };
var deserialized = JsonSerializer.Deserialize(values.FirstValue, bindingContext.ModelType, options);
bindingContext.Result = ModelBindingResult.Success(deserialized);
return Task.CompletedTask;
}
}
所以,当我从Swagger发出请求时,绑定是正确的,模型名称是Locales,但是当我从Postman或SPA发出请求时,绑定不起作用,模型名称是Locales[0]。
我试图理解ValueProvider.GetValue是如何工作的,但没有成功。
1条答案
按热度按时间zf2sa74q1#
如何在postman中传递参数?请尝试如下:
IValueProvider.GetValue使用指定的键来检索值对象,当参数中有多个
Locales
时,MetadataValueModelBinder
将执行多次,每次都获取一个Locales
的值。首次执行:
第二次执行:
测试结果: