如何使用模型绑定将复杂的 json 对象 POST 到 ASP.NET Core Web API

问题描述 投票:0回答:1

当前是否有任何原生内置于 ASP.NET Core 8 Web API 中的解决方案允许将复杂的 JSON 对象作为 [FromForm] 或 [FromBody] 参数(包括文件/文件数组)发送?我正在尝试从 axios 请求发布以下数据。我的控制器如下所示:

    [HttpPost("")]
    public async Task<IActionResult> AddDocumentReview([FromForm] UploadedDocumentReviewDTO documentReview)
    {
        return Ok(documentReview);
    }

我的模型如下:

public class UploadedDocumentReviewDTO
{
    [ModelBinder(Name = "review_details")]
    public required UploadedReviewDetailsDTO ReviewDetails {get; set;}
    
    [ModelBinder(Name = "document")]
    public required IFormFile Document {get; set;}
}

我尝试通过FormData使用FromForm的前端代码如下:

  const submit = () => {
let form = new FormData();

const reviewDetails : ReviewDetails = {
    rating_period_begin_date: ratingPeriodBeginModel.value!,
    rating_period_end_date: ratingPeriodEndModel.value!,
    document_title: documentTitleModel.value!
}

form.append('review_details' , JSON.stringify(reviewDetails))
form.append('document' , documentModel.value)

api.post('/DocumentReview', form, config).then(response => {

})

}

如您所见,我的主要模型很复杂,因为它内部有 UploadedReviewDetailsDTO 对象。尽管作为参数发送,但该嵌套对象似乎并未反序列化到模型,而且我总是收到一个错误,指出它丢失了,因为它是必需的对象(它应该是它及其内部组件)。我测试了是否将 UploadedReviewDetailsDTO 对象更改为字符串,然后它绑定得很好,但我希望它会在原始绑定到模型时反序列化所有元素,以便在进入控制器方法主体之前进行验证。我在 stackoverflow 上发现了一篇使用自定义模型绑定器的帖子,该帖子发布于 2017 年,但我希望此功能已通过内置于 .NET Core 中的更原生的解决方案添加到

c# asp.net-core-webapi
1个回答
0
投票

我没怎么用过

FormData
,但是将复杂的数据模型发送到API通常不是脑力劳动。

API 照常:

[HttpPost("add-some-data")]
public async Task<IActionResult> AddSomething([FromBody] MyModel model)
{
    return Ok();
}

其中

MyModel
可能很复杂:

public class MyModel
{
  public MyDocumentClass Document { get; set; }
  public List<Customers> Customers { get; set; } = new ();
}

如果您没有请求数据模型,您的艰苦工作将发生在前端,将不同类型的对象编译在一起。示例:

const submit = () => {

let requestModel = {document: this.myDocument, customers: [this.customer]};

api.post('/add-some-data', JSON.stringify(requestModel), config).then(response => {

})

如果您觉得有必要,我可以稍后找到额外的信息或创建一些示例。

© www.soinside.com 2019 - 2024. All rights reserved.