首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Swagger用户界面,多部分/表单数据中的对象数组

Swagger用户界面,多部分/表单数据中的对象数组
EN

Stack Overflow用户
提问于 2022-01-04 13:00:50
回答 1查看 2.8K关注 0票数 1

我有一个多部分/表单数据格式的PUT查询。

我需要发送一个类对象数组。这门课看上去像:

代码语言:javascript
运行
复制
    public class TestObjects
    {
       public long Id { get; set; }

       public string Name { get; set; }

       public decimal MaxScore { get; set; }
    }

在这个傲慢的领域里我应该写些什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-05 04:09:55

这是一个已知问题上的github,它似乎仍然没有被修复(我也尝试过.NET 6)。

您需要如下所示的数据:

然后是如下所示的定制模型活页夹:

代码语言:javascript
运行
复制
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;
    }
}

将模型绑定添加到模型类中:

代码语言:javascript
运行
复制
[ModelBinder(BinderType = typeof(MetadataValueModelBinder))]
public class TestObjects
{
    public long Id { get; set; }

    public string Name { get; set; }

    public decimal MaxScore { get; set; }
}

如果要显示还需要自定义IOperationFilter的示例,则可以看到架构示例不显示该示例。

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
services.AddSwaggerGen(c =>
{
    c.OperationFilter<CustomOperationFilter>();
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebApi5_0", Version = "v1" });
});

另一个解决方法是您可以使用[FromBody]而不是[FromForm]

代码语言:javascript
运行
复制
[HttpPut]
public void Post([FromBody] List<TestObjects> Competences)
{

}

将json数据如下所示:

代码语言:javascript
运行
复制
[
  {
    "id": 1,
    "name": "aa",
    "maxScore": 1
  },
  {
    "id": 2,
    "name": "bb",
    "maxScore": 2
  }
]

结果:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70579248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档