我正在我的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模型有一个EthnicID属性,如果它没有显示在编辑表单上,则该属性为空。
使用来自表单的字段进行模型更新的最佳做法是什么?我是否必须先从数据库中获取记录并手动更新其属性,如:
Person persistedPerson = peopleService.GetPerson(person.ID);
persistedPerson.Name = person.Name;
persistedPerson.DateOfBirth = person.DateOfBirth
// etc...
或者还有其他更清洁的方法吗?
答案 0 :(得分:2)
Stephen Walther刚刚在ASP.NET MVC中发布了an article describing this very thing。我建议您实际在LINQ to SQL之上创建自己的DTO和业务对象集,并根据language-integrated object database将gross complexities introduced by managing the DataContext处理为Pro LINQ的LINQ to SQL,应尽可能少地通过设计保持活着。
如果您打算将LINQ to SQL实体用作DTO,则应先获取实体,分离,更新,重新附加,然后提交。
答案 1 :(得分:1)
在您的控制器中,从存储库中检索现有人员,然后使用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);
...
}