2017-01-13 1 views
0

Ich habe einen ProductController mit einer GetRequest-Aktion bearbeiten und einer Aktion PostRequest bearbeiten.Modell für Post-Anfrage Edit Aktion Wird nicht ausgefüllt von Modell von Get Request. Aktion bearbeiten

Die Edit-GetRequest-Aktion ruft eine einzelne Product-Entität basierend auf dem Routen-ID-Wert aus der Anfrage ab und erstellt ein ProductViewModel. Ich habe implizite Konvertierungsmethoden für diese.

Die Ansicht baut mit den Werten her die ProductViewModel eine ProductEditViewModel zurückgegeben:

// 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}); 
    } 

Ich habe Zugriff auf die Seite bearbeiten GetRequest wenn meine applicion läuft und ein Produkt erfolgreich, jedoch bearbeiten angezeigt sehen können, wenn ich Senden Sie eine Post-Anforderung zurück, das ProductEditViewModel, das an die Edit PostRequest Action übergeben wird, ist leer. Die Namen und Id-Eigenschaften sollten ausgefüllt sein, da das Bild unverändert bleiben kann. Hier ist meine bearbeiten PostRequest Aktion:

[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); 
    } 

Mein ProductViewModels:

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

versuchen Sie, nur das 'ProductEditViewModel-Modell' an Ihre' POST'-Aktion zu übergeben. –

+1

Ich stimme Elmer zu. Die POST-Aktion sollte das Viewmodel nur als Parameter verwenden. Alles, was Sie in Ihrer POST-Aktion benötigen, sollte also auf dem Modell liegen. – MichaelCleverly

Antwort

0

ich nicht die Getter und Setter für die ProductEditViewModel hatte in der Lage sein zu vergeben Werte.

Verwandte Themen