【问题标题】:MVC model binding parent child (collections)MVC模型绑定父子(集合)
【发布时间】:2014-11-30 23:51:50
【问题描述】:

我正在尝试将我的视图模型中的子集合绑定到控制器中的域模型,但我不知道如何。 (我尝试使用 automapper 并没有走多远)。

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

MVC Partial View not rendering from an EditorTemplates

到目前为止,这就是我的控制器中的内容。我知道我的孩子可能需要进入 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);
    }

正确插入了父级,但是子级(他们是三个)只插入了一个,并且除了 parentID 之外,该值都为 null。

【问题讨论】:

    标签: c# asp.net-mvc-5 automapper


    【解决方案1】:

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

    有点不清楚你到底想做什么,但如果你正确使用了EditorTemplateChildVM,那么你可以创建一个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();
    }
    

    【讨论】:

    • 我正在做一个项目,并决定退后一步,准备一份测试表格,并解决/了解我需要为我的主要项目做的所有事情。我想要的是有一个主表单(父),在那个表单上我将有一个部分来添加/删除行(子)。这有意义吗?
    • OH ChildVM 用于 EditorTemplate,这就是为什么我的 ParentVM 中有子属性
    • 好吧,你又一次看对了钱。有效。我不得不将 foreach 从 viewmodel.Childs 更改为 viewModel.Children。我还从 ParentVM 中删除了 childs 属性,一切正常。你使用自动映射器吗?非常感谢。
    • 顺便说一句,我在发帖之前进行了很多研究,但令我惊讶的是,没有多少人在做我想做的事。我知道与添加/删除行有父/子关系是很常见的
    • @Cindy,我认为您的知识存在一些差距。查看您的模型,它们似乎具有相同的属性,因此应该是相同类型的对象并存储在同一个表中作为分层结构(ID,ParentID`NameDOB 等)其中一个值NULLParentID 表示这是它的顶级对象。使用目前的结构,不可能添加孙对象。
    猜你喜欢
    • 1970-01-01
    • 2012-03-25
    • 2017-04-02
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多