2016-06-10 107 views
1

我星期一有一个考试,我想问你是否有人知道什么是最好的方式来处理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(); 
     } 
    } 

这是一个干净的解决方案?

这将是第二个解决方案,我认为:

enter image description here

考试在MVC 2做与EF 4.0。

回答

0

公众的ActionResult获取(INT ID)//改变方法名获得 {VAR = productToEdit(由对在db.Products 其中p.ProductId == ID 选择P).FirstOrDefault(); //总是使用firstordefault而不是第一个

return View(productToEdit); 

} 

使用第二种方法。

+0

为什么第二?你能否更详细地解释我使用第二vs第一的好处? – bfmv991

2

你应该从来没有做一个全面的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); 
} 

注意的几件事情还:

  1. 该参数仍然应该通过id。它是网址的一部分,您应该使用该网址,而不是用于查找正确产品的内容。发布的值可能会被修改,但您无法更改URL中的id参数而无需请求完全不同的资源。

  2. 当您对发布的操作返回视图时,您需要传递发布的模型。这里唯一一次返回视图是否存在验证错误,除非您传递发布的模型,否则用户将无法更新现有值来修复这些错误。相反,他们只需要彻底开始。

  3. 我在这里使用Entity Framework查询语法。虽然可以使用使用LINQ to SQL语法,但它更冗长,可读性更强,而且非标准。

  4. 我使用FirstOrDefault而不是First作为演示目的,但在这里它实际上最适合使用db.Products.Find(id)

+0

那么,你如何在'return View'中传递模型?而且你宁愿让'var originalProduct = db.Products.Find(id)'比我做得更好? – bfmv991

+0

上面的示例代码是正确的:'return View(productToEdit);'。而且,是的,LINQ to SQL语法是一种令人憎恶的事情,使您的代码难以阅读和理解。 –

相关问题