ASP.NET Web API [FromForm]对象列表属性的自定义绑定在Postman中不起作用,但在Swagger中起作用

xlpyo6sf  于 2023-01-05  发布在  Postman
关注(0)|答案(1)|浏览(173)

我有一个控制器方法来接受多部分/表单-数据请求,其基本类型为对象的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是如何工作的,但没有成功。

zf2sa74q

zf2sa74q1#

如何在postman中传递参数?请尝试如下:

IValueProvider.GetValue使用指定的键来检索值对象,当参数中有多个Locales时,MetadataValueModelBinder将执行多次,每次都获取一个Locales的值。
首次执行:

第二次执行:

测试结果:

相关问题