2017-01-13 6 views
0

私は編集アクションGetRequestと編集アクションPostRequestを持つProductControllerを持っています。投稿要求のためのモデルEdit Action Get Getによって与えられたモデルによって編集されない編集アクション

Edit GetRequestアクションは、リクエストからのルートID値に基づいて個々のProductエンティティを取得し、ProductViewModelを構築します。私はこれらのための暗黙の変換メソッドを持っています。ビューが返さ

はProductViewModelあちこち値でProductEditViewModelを構築します。

// GET: Product/Edit/5 
    public async Task<ActionResult> Edit(int? id) 
    { 

     if (id == null) 
     { 
      return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
     } 
     ProductViewModel product = await db.Products.FindAsync(id); 

     var categoryID = db.Categories.Single(c => c.Products.Any(p => p.Id == id)).Id; 

     if (product == null) 
     { 
      return HttpNotFound(); 
     } 
     return View(new ProductEditViewModel { Id = product.Id, Name = product.Name, ByteImage = product.ByteImage, Price = product.Price, CategoryId = categoryID}); 
    } 

私はしかし、ときに私は、私のapplicionを実行するときに、編集のGetRequestページへのアクセス権を持ち、製品を編集することに成功し、表示見ることができますPost要求を返送すると、Edit PostRequest Actionに与えられたProductEditViewModelは空になります。イメージは変更されないままにすることができるので、名前とIDのプロパティを入力する必要があります。

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public async Task<ActionResult> Edit([Bind(Include = "Id,Name,Image,Price")] ProductEditViewModel model) 
    { 

     var oldImage = db.Products.Where(p => p.Id == model.Id).Select(x => x.Image).FirstOrDefault(); 


     if (ModelState.IsValid) 
     { 
      Product modifiedProduct = model; 

      if(modifiedProduct.Image == null) 
      { 
       modifiedProduct.Image = oldImage; 
      } 
      db.Entry(modifiedProduct).State = EntityState.Modified; 
      await db.SaveChangesAsync(); 
      return RedirectToAction("Index/" + model.categoryID); 
     } 
     return View(model); 
    } 

マイProductViewModels:ここに私の編集PostRequestアクションです

public class ProductViewModel 
    { 
     public int Id { get; set; } 
     [Required, Display(Name="Product Name")] 
     public string Name { get; set; } 
     [DataType(DataType.Upload)] 
     public HttpPostedFileBase Image { get; set; } 
     public string OutputImage { get; set; } 
     public Byte[] ByteImage { get; set; } 
     [Required] 
     public Decimal Price { get; set; } 
     public int CategoryId { get; set; } 

     public static byte[] ConvertToByte(ProductViewModel model) 
     { 
      if (model.Image != null) 
      { 
       byte[] imageByte = null; 
       BinaryReader rdr = new BinaryReader(model.Image.InputStream); 
       imageByte = rdr.ReadBytes((int)model.Image.ContentLength); 

       return imageByte; 
      } 

      return null; 
     } 

     // ViewModel => Model | Implicit type Operator 
     public static implicit operator Product(ProductViewModel viewModel) 
     { 
      var model = new Product 
      { 
       Id = viewModel.Id, 
       Name = viewModel.Name, 
       Image = ConvertToByte(viewModel), 
       Price = viewModel.Price 
      }; 

      return model; 
     } 

    // Model => ViewModel | Implicit type Operator 
    public static implicit operator ProductViewModel(Product model) 
    { 
     var viewModel = new ProductViewModel 
     { 
      Id = model.Id, 
      Name = model.Name, 
      OutputImage = string.Format("data:image/jpg;base64,{0}", Convert.ToBase64String(model.Image)), 
      ByteImage = model.Image, 
      Price = model.Price, 
      CategoryId = model.Id 
     }; 

     return viewModel; 
    } 

} 

ProductEditViewModel:

public class ProductEditViewModel 
{ 
    public int Id { get; set; } 
    [Required, Display(Name = "Product Name")] 
    public string Name { get; set; } 
    [DataType(DataType.Upload)] 
    public HttpPostedFileBase Image { get; set; } 
    public string OutputImage { get; set; } 
    public byte[] ByteImage { get; set; } 
    [Required] 
    public decimal Price { get; set; } 
    public int? CategoryId { get; set; } 

    public static implicit operator ProductViewModel(ProductEditViewModel viewModel) 
    { 
     var model = new Product 
     { 
      Id = viewModel.Id, 
      Name = viewModel.Name, 
      Image = ConvertToByte(viewModel), 
      Price = viewModel.Price 
     }; 

     return model; 
    } 

    public static implicit operator ProductEditViewModel(ProductViewModel viewModel) 
    { 
     var model = new ProductEditViewModel 
     { 
      Id = viewModel.Id, 
      Name = viewModel.Name, 
      ByteImage = ConvertToByte(viewModel), 
      Price = viewModel.Price 
     }; 

     return model; 
    } 



    private static byte[] ConvertToByte(ProductEditViewModel viewModel) 
    { 

     if (viewModel.Image != null) 
     { 
      byte[] imageByte = null; 
      BinaryReader rdr = new BinaryReader(viewModel.Image.InputStream); 
      imageByte = rdr.ReadBytes((int)viewModel.Image.ContentLength); 

      return imageByte; 
     } 

     return null; 
    } 
} 
+1

'ProductEditViewModel model'だけを' POST'アクションに渡してみてください。 –

+1

私はElmerに同意します。 POSTアクションはviewmodelのみをパラメータとして取る必要があります。したがって、POSTアクションで必要なものはすべてモデル上にある必要があります。 – MichaelCleverly

答えて

0

私が割り当てることができるようにProductEditViewModelためのゲッターとセッターを持っていませんでした値。

関連する問題