我有一个多部分/表单数据格式的PUT查询。
我需要发送一个类对象数组。这门课看上去像:
public class TestObjects
{
public long Id { get; set; }
public string Name { get; set; }
public decimal MaxScore { get; set; }
}
在这个傲慢的领域里我应该写些什么?
发布于 2022-01-05 04:09:55
这是一个已知问题上的github,它似乎仍然没有被修复(我也尝试过.NET 6)。
您需要如下所示的数据:
然后是如下所示的定制模型活页夹:
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;
}
}
将模型绑定添加到模型类中:
[ModelBinder(BinderType = typeof(MetadataValueModelBinder))]
public class TestObjects
{
public long Id { get; set; }
public string Name { get; set; }
public decimal MaxScore { get; set; }
}
如果要显示还需要自定义IOperationFilter
的示例,则可以看到架构示例不显示该示例。
public class CustomOperationFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
if (operation.RequestBody!=null && operation.RequestBody.Content.TryGetValue("multipart/form-data", out var openApiMediaType))
{
var options = new JsonSerializerOptions { WriteIndented = true };
var array = new OpenApiArray
{
new OpenApiString(JsonSerializer.Serialize(new TestObjects {Id = 0, Name="string",MaxScore=0}, options)),
};
openApiMediaType.Schema.Properties["Competences"].Example = array;
}
}
}
注册IOperationFilter
services.AddSwaggerGen(c =>
{
c.OperationFilter<CustomOperationFilter>();
c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebApi5_0", Version = "v1" });
});
另一个解决方法是您可以使用[FromBody]
而不是[FromForm]
。
[HttpPut]
public void Post([FromBody] List<TestObjects> Competences)
{
}
将json数据如下所示:
[
{
"id": 1,
"name": "aa",
"maxScore": 1
},
{
"id": 2,
"name": "bb",
"maxScore": 2
}
]
结果:
https://stackoverflow.com/questions/70579248
复制相似问题