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

如何在C# ASP.NET MVC单表单中提交两个不同模型的数据?

解决多模型注册表单的模型绑定问题

问题根源

你的代码存在两个核心问题,导致表单数据无法传递到控制器:

  1. 表单输入框的name属性错误,使用@Model.user.UserName会输出属性的当前值(初始为空),而非MVC模型绑定需要的属性路径。
  2. ViewModel的属性采用小写命名(user、emp),虽模型绑定不严格区分大小写,但遵循PascalCase命名规范可避免潜在问题。

修正步骤

1. 规范ViewModel命名(推荐)

将ViewModel的属性改为首字母大写,符合C#命名规范:

public class UserEmployee
{
    public UserModel User { get; set; }
    public EmployeeModel Emp { get; set; }
}

2. 同步控制器初始化代码

对应ViewModel的属性名修改,确保实例化正确:

[HttpGet]
public ActionResult RegisterEmployee()
{
    var model = new UserEmployee();
    model.User = new UserModel();
    model.Emp = new EmployeeModel();
    return View(model);
}

[HttpPost]
public ActionResult RegisterEmployee(UserEmployee useremp)
{
    if (ModelState.IsValid)
    {
        // 先保存UserModel,获取自动生成的UserId
        _db.Users.Add(useremp.User);
        _db.SaveChanges();
        
        // 给EmployeeModel关联UserId
        useremp.Emp.UserId = useremp.User.Id;
        // 保存EmployeeModel
        _db.Employees.Add(useremp.Emp);
        _db.SaveChanges();
        
        return RedirectToAction("Index");
    }
    return View(useremp);
}

3. 修正表单的name属性

表单输入框的name需使用ViewModel的属性路径,同时补充确认密码的输入绑定:

@model ZeroHungerProject.Models.UserEmployee

<form action="" method="post">
    <div class="form-group">
        <label>User Name</label>
        <input type="text" name="User.UserName" class="form-control" placeholder="User Name" value="@Model.User.UserName">
    </div>
    <div class="form-group">
        <label>Email address</label>
        <input type="email" name="User.Email" class="form-control" placeholder="Email" value="@Model.User.Email">
    </div>
    <div class="form-group">
        <label>Phone</label>
        <input type="number" name="Emp.Phone" class="form-control" placeholder="Phone" value="@Model.Emp.Phone">
    </div>
    <div class="form-group">
        <label>Password</label>
        <input type="password" name="User.Password" class="form-control" placeholder="Password">
    </div>
    <div class="form-group">
        <label>Confirm Password</label>
        <input type="password" name="ConfirmPassword" class="form-control" placeholder="Confirm Password">
    </div>
    <button type="submit" class="btn btn-primary btn-flat m-b-30 m-t-30">Register</button>
</form>

4. 添加确认密码验证(必要)

在ViewModel中新增确认密码属性,通过数据注解实现密码匹配验证:

using System.ComponentModel.DataAnnotations;

public class UserEmployee
{
    public UserModel User { get; set; }
    public EmployeeModel Emp { get; set; }
    
    [Compare("User.Password", ErrorMessage = "密码与确认密码不匹配")]
    public string ConfirmPassword { get; set; }
}

核心原理

MVC模型绑定会根据表单输入框的name属性值,匹配ViewModel的属性路径(如User.UserName对应UserEmployee.User.UserName),从而将表单值正确映射到ViewModel的对象中。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 15:05:34