【问题标题】:Best way to update a LINQ model coming from a form更新来自表单的 LINQ 模型的最佳方法
【发布时间】:2009-02-27 17:40:00
【问题描述】:

我正在我的 ASP.NET MVC 应用程序中设计将接收对象的表单。典型的编辑操作如下所示:

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Edit(int id, Person person)
    {
        peopleService.SavePerson(person);
        return Redirect("~/People/Index");
    }

服务中的SavePerson 调用执行以下操作:

    public void SavePerson(Person person)
    {
        _peopleRepository.SavePerson(person);
    }

而存储库中的 SavePerson 调用是这样做的:

    public void SavePerson(Person person)
    {
        using (var dc = new SIGAPDataContext())
        {
            if (person.IsNew)
            {
                dc.People.InsertOnSubmit(person);
            }
            else
            {
                dc.People.Attach(person, true);
            }

            dc.SubmitChanges();
        }
    }

现在,这在我创建新记录时效果很好。但是,当我在没有所有表单元素的情况下更新它时,它会使其他字段为空。例如,我的 Person 模型有一个 NationalityID 属性,如果它没有显示在编辑表单上,则该属性为空。

仅使用来自表单的字段更新模型的最佳做法是什么?我是否必须先从数据库中获取记录并手动更新其属性,例如:

Person persistedPerson = peopleService.GetPerson(person.ID);
persistedPerson.Name = person.Name;
persistedPerson.DateOfBirth = person.DateOfBirth
// etc...

或者还有其他更清洁的方法吗?

【问题讨论】:

    标签: c# asp.net-mvc linq


    【解决方案1】:

    Stephen Walther 刚刚在 ASP.NET MVC 中发布了an article describing this very thing。我建议您实际上在 LINQ to SQL 之上创建自己的一组 DTO 和业务对象,并将 LINQ to SQL 视为language-integrated object database,因为gross complexities introduced by managing the DataContext,根据Pro LINQ,应该尽可能少地保持活动状态尽可能设计。

    如果您要将 LINQ to SQL 实体用作 DTO,您应该先获取实体,分离它,更新它,重新附加它,然后提交它。

    【讨论】:

      【解决方案2】:

      在您的控制器中,从存储库中检索现有人员,然后使用 UpdateModel/TryUpdateModel 并传入您要更新的属性的白名单。这将使用控制器上的 ValueProvider,因此无需在操作参数列表中获取 Person 对象。

      public ActionResult Edit( int id )
      {
            Person person = peopleService.GetPerson(id);
            UpdateModel(person,new string[] { list of properties to update } );
            peopleService.SavePerson(person);
      
            ...
      }
      

      【讨论】:

      • 现在我只需要如何使用 UpdateModel 来处理我的表单上的嵌套实体。非常感谢!
      • 如有必要,使用不同的白名单和前缀将它们更新为子模型。
      • 查看我对这个问题的回答:stackoverflow.com/questions/594412/…
      猜你喜欢
      • 2019-04-17
      • 2013-12-20
      • 1970-01-01
      • 2010-10-14
      • 2013-06-04
      • 1970-01-01
      • 2014-04-17
      • 2010-09-26
      • 1970-01-01
      相关资源
      最近更新 更多