我使用的是ASP.NET MVC3和实体框架4.1。
我想知道当HTTP Post中没有提供所有属性时,更新对象的首选方法是什么。
例如,Order对象可能具有Items、CreateDate和UpdateDate属性。在编辑表单中,只会输入Items属性并将其发布到编辑ActionMethod。因此,下面的基本代码将失败,因为订单中没有包含CreateDate和UpdateDate属性。
[HttpPost]
public ActionResult Edit(Order order)
{
{
db.Entry(order).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(order);
}
处理这种情况的最佳方法是什么?对于像这样的简单对象,我认为CreateDate和UpdateDate可以保存在隐藏字段中,但是对于更复杂的对象(比如那些具有几个一对多关系的对象),应该使用对象id来检索整个对象,然后用表单中回发的值覆盖它的一些属性……
发布于 2011-07-14 08:54:22
一种选择是创建视图模型
public class OrderEditModel
{
//properties used in the view
}
[HttpPost]
public ActionResult Edit(OrderEditModel orderEditModel)
{
// map OrderEditModel to Order
db.Entry(order).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
您可以使用AutoMapper来映射它们
另一种选择是从数据库中检索对象并更新它
[HttpPost]
public ActionResult Edit(string id)
{
var order = db.Orders.FindByKey(id);
UpdateModel(order);
db.SaveChanges();
return RedirectToAction("Index");
}
发布于 2011-07-14 08:48:55
在这种情况下,createdate和modifydate位于发布的表单(名为createDate和modDate)上的隐藏输入中,那么您可以按如下方式从请求表单集合中检索它们,即使它们不在Order对象上。
[HttpPost]
public ActionResult Edit(Order order)
{
var createdOn = this.Request.Form["createDate"];
var editedOn = this.Request.Form["modDate"];
db.Entry(order).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
https://stackoverflow.com/questions/6687128
复制相似问题