2016-06-10 113 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語法是一種令人憎惡的事情,使您的代碼難以閱讀和理解。 –

相關問題