[英]Model for Post Request Edit Action Not being filled in by Model given by Get Request Edit Action
我有一個ProductController,其中包含一個Edit Action GetRequest和一個Edit Action PostRequest。
Edit GetRequest Action根據請求中的路由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});
}
運行我的應用程序時,我可以訪問Edit GetRequest頁面,並且可以看到成功顯示了要編輯的產品,但是,當我發回Post請求時,提供給Edit PostRequest Action的ProductEditViewModel為空。 它應該具有Name和Id屬性,因為Image可以保持不變。 這是我的Edit PostRequest Action:
[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:
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;
}
}
我沒有ProductEditViewModel的獲取器和設置器能夠分配值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.