当前是否有任何原生内置于 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 中的更原生的解决方案添加到
我没怎么用过
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 => {
})
如果您觉得有必要,我可以稍后找到额外的信息或创建一些示例。