MVC 2 EF 4.0正确的方式来处理类似产品的编辑
我星期一有一个考试,我想问你是否有人知道什么是最好的方式来处理ProductView中的编辑。 或多或少是关于ProductController中的代码。MVC 2 EF 4.0正确的方式来处理类似产品的编辑
也许有人知道比我的两次尝试更清洁的解决方案。
这是第一种方式,我没有:
我有这个在我的编辑
public ActionResult Edit(int id)
{
var productToEdit = (from p in db.Products
where p.ProductId == id
select p).First();
return View(productToEdit);
}
这在编辑一职的get:
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Product productToEdit)
{
try
{
// TODO: Add update logic here
var originalProducts = (from p in db.Products
where p.ProductId == productToEdit.ProductId
select p).First();
db.ApplyCurrentValues(originalProducts.EntityKey.EntitySetName, productToEdit);
db.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
这是一个干净的解决方案?
这将是第二个解决方案,我认为:
考试在MVC 2做与EF 4.0。
公众的ActionResult获取(INT ID)//改变方法名获得 {VAR = productToEdit(由对在db.Products 其中p.ProductId == ID 选择P).FirstOrDefault(); //总是使用firstordefault而不是第一个
return View(productToEdit);
}
使用第二种方法。
你应该从来没有做一个全面的try
块。您可能会吞下各种不同的异常,这与该对象在数据库中不存在的事实无关。
尽管如此,你甚至不应该使用try
块。这里只有你关心的一个用例:未发现数据库匹配,所以它是最好,使用FirstOrDefault
代替First
再涂null
- 值情景:
public ActionResult Edit(int id, Product productToEdit)
{
var originalProduct = db.Products.FirstOrDefault(p.ProductId == id);
if (originalProduct == null)
{
return new HttpNotFoundResult();
}
// do update
return View(productToEdit);
}
注意的几件事情还:
该参数仍然应该通过
id
。它是网址的一部分,您应该使用该网址,而不是用于查找正确产品的内容。发布的值可能会被修改,但您无法更改URL中的id
参数而无需请求完全不同的资源。当您对发布的操作返回视图时,您需要传递发布的模型。这里唯一一次返回视图是否存在验证错误,除非您传递发布的模型,否则用户将无法更新现有值来修复这些错误。相反,他们只需要彻底开始。
我在这里使用Entity Framework查询语法。虽然可以使用使用LINQ to SQL语法,但它更冗长,可读性更强,而且非标准。
我使用
FirstOrDefault
而不是First
作为演示目的,但在这里它实际上最适合使用db.Products.Find(id)
。
那么,你如何在'return View'中传递模型?而且你宁愿让'var originalProduct = db.Products.Find(id)'比我做得更好? – bfmv991
上面的示例代码是正确的:'return View(productToEdit);'。而且,是的,LINQ to SQL语法是一种令人憎恶的事情,使您的代码难以阅读和理解。 –
为什么第二?你能否更详细地解释我使用第二vs第一的好处? – bfmv991