2011-06-29 112 views
3

我想通過圖像更新數據庫中現有的產品對象,但只有當我創建新對象時,圖像纔會成功轉到數據庫。在HttpPost後更新模型

我試圖更新我的對象這樣

[HttpPost] 
public ActionResult Edit(Product product, HttpPostedFileBase image) 
    { 

    if (ModelState.IsValid) 
     { 
      if (image != null) 
      { 
       product.ImageMimeType = image.ContentType; 
       product.ImageData = new byte[image.ContentLength]; 
       image.InputStream.Read(product.ImageData, 0, image.ContentLength); 
      } 
      if (product.ProductID != 0) 
       UpdateModel<Product>(repository.Products.FirstOrDefault(p => p.ProductID == product.ProductID)); 
      repository.SaveProduct(product); 
      TempData["message"] = string.Format("{0} has been saved", product.Name); 
      return RedirectToAction("Index"); 
     } 
     return View(product); 
    } 
//repository.SaveProduct() 


public void SaveProduct(Product product) 
     { 

    if (product.ProductID == 0) 
      { 
       context.Products.Add(product); 
      } 
      context.SaveChanges(); 
     } 

@ Upload new image: input type="file" name="Image" input type="submit" value="Save" @Html.ActionLink("Cancel and return to List", "Index") }

回答

3

這是各種錯誤。

您應該使用特定的ViewModels來編輯和創建操作。

定義包含要編輯的屬性和任何UI驗證一個單獨的類:

public class EditProductViewModel { 
    [HiddenInput] 
    public int Id {get;set;} 
    [Required] 
    public string Name {get;set;} 
    [Required] 
    public string Description {get;set;} 
    public HttpPostedFileBase Image {get;set;} 
} 

然後改變你的操作方法如下所示:

[HttpPost] 
public ActionResult Edit(EditProductViewModel viewModel) { 
    if (ModelState.IsValid) { 
     var product = repository.Products.FirstOrDefault(p => p.Id == viewModel.Id); 
     // TODO - null check of product 
     // now lefty righty 
     product.Name = viewModel.Name; 
     product.Description = viewModel.Description; 

     if (viewModel.Image.ContentLength > 0) { 
      product.ImageMimeType = image.ContentType; // wouldn't trust this (better to lookup based on file extension)     
      product.ImageData = new byte[image.ContentLength];     
      image.InputStream.Read(product.ImageData, 0, image.ContentLength); 
     } 

     repository.SaveProduct(product); 
     return RedirectToAction("Index"); 
    } 

    return View(viewModel); 
} 

Here's a good post討論視圖模型模式。

0

嘗試這樣做

context.Products.Attach(product); 

注意:只有在做更新時,不插入時一種新產品。

0

試試這個:

public void SaveProduct(Product product) 
{ 
    if (product.ProductID == 0) 
    { 
     context.Products.Add(product); 
    } 
    else // Update operation 
    { 
     context.Products.Attach(product); 
    } 
    context.SaveChanges(); 
} 

注:我會改變你確定的方式這是一個新的或更新的產品。

+0

他爲什麼要改變他決定的方式,如果它是一個新對象? – jgauffin

+0

我沒有說「他應該」,但是表示「EditMode」的布爾變量更健壯。 –

+0

爲什麼它更健壯? ID爲0很清楚,不是嗎? – jgauffin

0

[HttpPost]

公共RedirectToRouteResult保存(TestViewModel視圖模型)

{

TempData["Output"] = "Here is some response"; 
return RedirectToAction("Index", viewModel); 

}

4

我注意到你已經閱讀了「Pro ASP.NET MVC 3框架」,並且遇到了和我一樣的問題。

筆者在這裏有一個錯誤,代碼應爲(您必須引用和使用起初System.Data.Entity的命名空間):

public void SaveProduct(Product product) 
    { 
     if (product.ProductID == 0) 
     { 
      context.Products.Add(product); 
     } 
     else 
     { 
      context.Entry(product).State = System.Data.EntityState.Modified; 
     } 

     context.SaveChanges(); 
    } 
+0

謝謝你!這爲我節省了很多時間! –