2

私はApressProASP.NET MVC 3 FrameworkブックのSportsStoreサンプルプロジェクトに従い、その概念をアプリケーションに適用しようとしています。私を悩ませている領域の1つは、サンプルで画像を製品に追加してデータベースに保存できることですが、新しい画像をアップロードせずに特定の製品を編集すると、画像データが消去されます。商品を編集できるようにしたいのですが、HTTP POSTから返された画像データがnullの場合、Entity Frameworkに既存の画像データ(およびコンテンツタイプ)を保持させたいと考えています。新しい画像がアップロードされていない場合、この画像フィールドをnullで更新しないようにEFに指示するにはどうすればよいですか?

SportsStoreサンプルの編集コードは次のとおりです。

[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);
    }
    _repository.SaveProduct(product);
    TempData["message"] = string.Format("{0} has been saved", product.Name);
    return RedirectToAction("Index");
  }
  else
  {
    return View(product);
  }
}

編集:Rondelの場合-Productクラスの定義は次のとおりです

namespace SportsStore.Domain.Entities
{
  public class Product
  {
    [HiddenInput(DisplayValue=false)]
    public int ProductId { get; set; }

    [Required(ErrorMessage = "Please enter a product name")]
    public string Name { get; set; }

    [Required(ErrorMessage = "Please enter a description")]
    [DataType(DataType.MultilineText)]
    public string Description { get; set; }

    [Required]
    [Range(0.01, double.MaxValue, ErrorMessage = "Please enter a positive price")]
    public decimal Price { get; set; }

    [Required(ErrorMessage = "Please specify a category")]
    public string Category { get; set; }

    public byte[] ImageData { get; set; }

    [HiddenInput(DisplayValue = false)]
    public string ImageMimeType { get; set; }
  }
}

編集EFに特定のフィールドのみを保存させ、他のフィールドはデータベースにそのままにしておくにはどうすればよいですか?

4

2 に答える 2

2

ここでの基本的な問題は、Productバックをデータベースに保存するときに、ImageMimeTypeおよびImageDataフィールドを、MVC3ProductFormCollection. 現在、古い画像情報image==nullを再利用するロジックを実装していないかどうかを確認しています。Productやりたいことは次のとおりです。

if (ModelState.IsValid)
{
  if(image != null)
  {
     product.ImageMimeType = image.ContentType;
     product.ImageData = new byte[image.ContentLength];
     image.InputStream.Read(product.ImageData, 0, image.ContentLength);
  }
 else
 {
    //set this Product image details from the existing product in the db
    product.ImageMimeType= getImageMimeTypeForProduct(product.ProductId );
    product.ImageData = getImageDataForProduct(product.ProductId );
 }
  _repository.SaveProduct(product);
  TempData["message"] = string.Format("{0} has been saved", product.Name);
  return RedirectToAction("Index");
}
else
{
  return View(product);
}

明らかに、これら 2 つの方法は実際には存在しませんが、考え方は同じです。Productその製品のデータベースから既存の値を取得し、保存して値を上書きする前に、それらが のローカル バージョンに反映されていることを確認します。

于 2011-12-27T21:23:43.467 に答える