MVC 模型绑定父子项(集合)

本文关键字:集合 父子 模型 绑定 MVC | 更新日期: 2023-09-27 18:32:37

我正在尝试将子集合从我的视图模型绑定到控制器中的域模型,但我不知道如何操作。(我尝试使用自动映射器,但没有走得很远)。

我已经掌握了有关我正在处理的内容的所有信息,因此为了保存树木,我认为放置链接可能很容易,而不是重复相同的代码。

MVC 部分视图未从编辑器模板呈现

到目前为止,这就是我在控制器中拥有的内容。我知道我的孩子可能需要在 for 循环或其他什么。

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(ParentVM viewModel)
    {
        if (ModelState.IsValid)
        {
            var child = new Child()
            {
                Name = viewModel.Name,
                DOB = viewModel.DOB,
                Address = viewModel.Address
            };
            var parent = new Parent()
            {
                FirstName = viewModel.FirstName,
                LastName = viewModel.LastName
            };
            //Parent parent = new Parent();              
            //var employee = AutoMapper.Mapper.Map<Parent, ParentVM>(parent);
            db.Parents.Add(parent);
            db.Childs.Add(child);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(viewModel);
    }
父项

已正确插入,但子项(它们是三个)仅插入一个,并且除父 ID 外,值均为空。

MVC 模型绑定父子项(集合)

您的var child = new Child(){..代码没有意义。看看你之前的问题,ParentVM甚至不应该包含NameDOBAddress的属性。它们似乎是 ChildVM 类的属性,而不是ParentVM(也许它们是两者的属性,但无法从您的代码中分辨出来),并且在任何情况下您都不会为 ParentVM.NameParentVM.DOB 等呈现任何控件,因此当您回发时它们将始终为 null(因此当您保存到数据库时为 null)。

有点不清楚你想做什么,但是如果你正确地使用了EditorTemplate ChildVM,那么你Child可以使用

if (ModelState.IsValid)
{
  ....
  // assumes your using a view model named ChildVM and property Childs is typeof List<ChildVM>
  foreach(ChildVM item in viewmodel.Childs) 
  {
    // Create a new Child based on ChildVM
    var child = new Child()
    {
      Name = item.Name,
      DOB = item.DOB,
      Address = item.Address
    };
    db.Childs.Add(child);
  }
  ....
  db.SaveChanges();
}