获取请求编辑操作给出的模型未填写请求后编辑操作的模型



我有一个ProductController,它有一个Edit Action GetRequest和一个Edit Action PostRequest。

Edit GetRequest Action根据请求中的路由ID值获取单个Product实体,并构建ProductViewModel。我有这些的隐式转换方法。

返回的View使用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操作的ProductEditViewModel为空。它应该填写名称和Id属性,因为图像可以保持不变。这是我的编辑PostRequest操作:

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

我的产品视图模型:

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的getter和setter来分配值。

最新更新