如何在C# ASP.NET MVC单表单中提交两个不同模型的数据?
解决多模型注册表单的模型绑定问题
问题根源
你的代码存在两个核心问题,导致表单数据无法传递到控制器:
- 表单输入框的
name属性错误,使用@Model.user.UserName会输出属性的当前值(初始为空),而非MVC模型绑定需要的属性路径。 - 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
相关产品推荐
相关产品推荐

