You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Core 7中如何通过FromForm传递含嵌套对象的类至API

解决.NET Core 7中[FromForm]绑定包含嵌套对象和IFormFile的模型问题

问题核心是.NET Core表单绑定对嵌套对象的参数命名有特定要求,没遵循的话会导致整个模型绑定失败,所有属性都为空。按以下步骤调整就能解决:

1. 确保嵌套类属性可被绑定

首先检查SecondLevel类的所有属性都有公共的getter和setter,模型绑定需要可读写的属性才能正常赋值:

public class SecondLevel
{
    public int Id { get; set; }
    public string LevelName { get; set; }
    // 其他属性都要保持public且有get/set
}

2. 用点标记法传递嵌套对象的属性

不管用Swagger、AJAX还是curl,传递嵌套对象的属性时,必须用Level.属性名的格式命名参数,这样绑定器才能识别并映射到嵌套对象:

curl示例

curl -X POST "https://your-api-domain/api/level" \
-F "HomePlanId=HP-202405" \
-F "NewImageFiles=@front.jpg" \
-F "NewImageFiles=@back.jpg" \
-F "Level.Id=5" \
-F "Level.LevelName=SubLevelOne"

AJAX示例

const formData = new FormData();
// 添加基础属性
formData.append('HomePlanId', 'HP-202405');
// 添加文件
formData.append('NewImageFiles', document.getElementById('fileInput').files[0]);
formData.append('NewImageFiles', document.getElementById('fileInput').files[1]);
// 添加嵌套对象属性
formData.append('Level.Id', 5);
formData.append('Level.LevelName', 'SubLevelOne');

fetch('/api/level', {
    method: 'POST',
    body: formData
})
.then(res => res.json())
.then(data => console.log(data));

Swagger操作

在Swagger页面填写参数时,直接把嵌套属性写成Level.Id、Level.LevelName的格式即可,Swagger会自动识别并生成正确的表单请求。

3. 验证控制器接口定义

确保控制器的POST方法正确标记了[FromForm],参数类型为LevelData:

[ApiController]
[Route("api/level")]
public class LevelController : ControllerBase
{
    [HttpPost]
    public IActionResult CreateLevel([FromForm] LevelData model)
    {
        // 这里就能正常获取到所有属性值了
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        // 业务逻辑处理
        return Ok(model);
    }
}

原理说明

.NET Core的表单模型绑定器处理复杂嵌套对象时,依赖点分隔的命名约定来关联父模型和嵌套对象的属性。如果没有用这种方式传递参数,绑定器无法解析嵌套对象的结构,会直接判定模型绑定失败,导致所有属性都为空值。

内容的提问来源于stack exchange,提问作者Pablo Andres Barrantes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 21:55:15