2011-12-10 3 views
4

私はPro ASP.NET MVC 3 Framework by Apressを読んでいます。私は画像のアップロードと表示の例に従っています。問題は、画像を製品にアップロードするときに問題なく動作しますが、後でたとえば説明を編集してから製品を保存する場合は、画像が消えることです。問題は、画像のアップロードが空で、context.SaveChanges()が空の画像データフィールドを含むすべてのデータフィールドを保存するため、画像データを渡していないということです。mvc 3で成功した画像アップロードがあっても、画像を編集するときに消え去る

私は立ち往生しています。誰かが私を助けることができたら本当に感謝します!

これは、編集ページの一部です:

<label>Image</label> 
if (Model.ImageData == null) 
{ 
    @:Null 
} 
else 
{ 
    <img id="imageFile" runat="server" src="@Url.Action("GetImage", "Product", new { Model.Name })" /> 
} 
<label>Upload image:</label> 
<input type="file" name="Image" runat="server" /> 

更新する場合:

public ActionResult Edit(Product product, HttpPostedFileBase image) 
    { 
     if (ModelState.IsValid) 
     { 
      if (image != null && image.ContentLength > 0) 
      { 
       product.ImageMimeType = image.ContentType; 
       product.ImageData = new byte[image.ContentLength]; 
       image.InputStream.Read(product.ImageData, 0, image.ContentLength); 
      } 
      repository.SaveProduct(product); 
      TempData["message"] = string.Format("{0} har sparats", product.Name); 
      return RedirectToAction("Index"); 
     } 
     else 
     { 
      return View(product); 
     } 
    } 

省製品:

public void SaveProduct(Product product) 
    { 
     if (product.ProductID == 0) 
     { 
      context.Products.Add(product); 
     } 
     else 
     { 
      context.Entry(product).State = EntityState.Modified; 
     } 
     int result = context.SaveChanges(); 
    } 
+0

保存したいかどうかの確認はどうですか? –

+0

私はそれを行うことができました、問題は、私はいくつかのデータフィールドを更新するだけでいくつかのデータフィールドを残す方法を知らないということです。私はデータ行全体を更新する方法しか知りません。私はまた、成功していない行を更新する前に、現在の製品の行から既存のイメージデータフィールドを読み込もうとしました... – Martin

答えて

4

の問題のあなたの理解は正しいです。 ProductEntityState.Modified EFのマークを付けると、すべてのプロパティが変更されています。したがって、あなたの現在のProductがコントローラから来ていて、画像がないときは、SaveChanges()を呼び出すときに、EFがそれをDBから削除します。手動Product上のすべてのプロパティを設定する必要があります。この場合

var productInDb = context.Products.Find(product.Id); 
productInDb.Name = product.Name; 
productInDb.Description = product.Description; 
if (product.ImageData !=null) 
{ 
    productInDb.ImageData = product.ImageData; 
    productInDb.ImageMimeType = product.ImageMimeType; 
} 

  1. あなたは、元のProductをロードし、ちょうど必要なinstread EntityState.Modifiedを使用してのプロパティを更新:
    は、私は2つのオプションを参照してください。

  2. あなたがマークした後、あなたのProductあなたはデシベルから画像値を再設定変更など:

    context.Entry(product).State = EntityState.Modified; 
    if (product.ImageData == null) 
    { 
        var databaseValues = context.Entry(product).GetDatabaseValues(); 
        product.ImageData = (byte[])databaseValues["ImageData"]; 
        product.ImageMimeType = (string)databaseValues["ImageMimeType"]; 
    } 
    

    私だけの画像に関連するプロパティを再設定する必要があり、この場合。

両方の実装では、更新中にImageDataを削除する方法はありません。

+0

私は最初のアプローチを使用し、それは素晴らしい仕事でした! – Martin

0

あなたは@nemesvが提供する2番目のオプションを試してみて、あなたのエンティティクラスがあなたのDbContextに異なる名前空間の相対的である場合は、ここで説明したように、あなたは、エンティティフレームワークによって発生した例外が発生しますが:

エントリー.GetDatabaseValues()throw EntitySqlException

タイプ 'XXX'は が見つかりませんでした。必要なスキーマがロードされ、 の名前空間が正しくインポートされていることを確認してください。

http://social.msdn.microsoft.com/Forums/en/adodotnetentityframework/thread/fa67aa0e-3bca-44a5-9e00-af6362a539a7

周りの仕事があります表示されますが、その快適ではありません。それはイメージが製品に関連付けられたままになることを可能にする。ここで

は、私はそれをやった方法です:

if (product.ImageData == null) 
{ 
    // Get Product Context reference 
    var productContext = context.Entry(product); 
    productContext.State = EntityState.Modified; 

    // Copy client values and reload orignal product values from DB. 
    var clientValues = productContext.CurrentValues.Clone().ToObject(); 
    productContext.Reload(); 
    productContext.CurrentValues.SetValues(clientValues); 

    // Get database values (Original) 
    var currentValues = productContext.Entity; 
    var databaseValues = (Product)productContext.OriginalValues.ToObject(); 

    // Change image properties to match original values 
    productContext.Entity.ImageData = databaseValues.ImageData; 
    productContext.Entity.ImageMimeType = databaseValues.ImageMimeType; 
} 
0

私は同様の問題がありました。編集ビューに@Html.HiddenFor(model => model.Image)を追加すると、imageURLが完全に渡されました。

関連する問題