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

ASP.NET MVC如何通过Model类向控制器提交嵌套对象数据

解决ASP.NET MVC嵌套对象表单提交绑定问题

核心问题在于ASP.NET MVC的模型绑定器依赖表单字段的name属性与对象层级结构严格匹配,才能正确识别嵌套属性。以下是具体修改方案:

1. 先明确模型结构示例(方便对应修改)

假设你的模型定义大致如下:

public class NewUser
{
    // 基础属性
    public string Username { get; set; }
    // 嵌套对象
    public UserInformation Information { get; set; }

    // 关键:初始化嵌套对象,避免绑定器无法赋值
    public NewUser()
    {
        Information = new UserInformation();
    }
}

public class UserInformation
{
    public string Email { get; set; }
    public string Phone { get; set; }
}

2. 手动修改HTML表单字段的name属性

直接编写HTML时,必须给嵌套属性的字段设置符合层级的name值,格式为[父属性名].[子属性名]:

<form action="/Users/CreateUser" method="post">
    <!-- NewUser的基础属性 -->
    <input type="text" name="Username" placeholder="用户名" />

    <!-- 嵌套的UserInformation属性:必须带Information前缀 -->
    <input type="email" name="Information.Email" placeholder="邮箱" />
    <input type="tel" name="Information.Phone" placeholder="手机号" />

    <button type="submit">提交</button>
</form>

3. 推荐方案:使用Razor强类型视图自动生成正确字段

如果是用Razor视图开发(强类型视图,模型指定为NewUser),使用HtmlHelper方法可以自动生成符合绑定规则的name属性,避免手动写错:

@model NewUser

@using (Html.BeginForm("CreateUser", "Users", FormMethod.Post))
{
    @Html.TextBoxFor(m => m.Username, new { placeholder = "用户名" })
    @Html.TextBoxFor(m => m.Information.Email, new { placeholder = "邮箱" })
    @Html.TextBoxFor(m => m.Information.Phone, new { placeholder = "手机号" })

    <button type="submit">提交</button>
}

生成的HTML会自动将嵌套字段的name设为Information.Email、Information.Phone,模型绑定器能直接识别并赋值给NewUser.Information。

额外注意事项

  • 如果你的视图模型是PortalUsersViewModel(包含NewUser属性),而控制器接收的是NewUser参数,需要调整表单字段的name为NewUser.Information.Email,或者将控制器参数改为PortalUsersViewModel,再从中提取NewUser对象。
  • 必须确保嵌套对象(UserInformation)已被初始化(比如在NewUser的构造函数中实例化),否则模型绑定器无法为null的对象赋值。

内容的提问来源于stack exchange,提问作者Joshua Bernardo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:25:24