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;
}
}
versuchen Sie, nur das 'ProductEditViewModel-Modell' an Ihre' POST'-Aktion zu übergeben. –
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