asp.net-mvc-3 – 在mvc 3中上传成功的图像,但编辑图像时会消失
发布时间:2020-12-16 10:01:27 所属栏目:asp.Net 来源:网络整理
导读:我正在阅读Apress的Pro ASP.NET MVC 3 Framework.我正在关注上传和显示图片的示例.问题是它在将图像上传到产品时工作正常,但如果我以后想要编辑描述然后保存产品图像就会消失.我知道问题在于,在保存产品时我没有传递图像数据,因为图像上传为空,而context.Sav
|
我正在阅读Apress的Pro ASP.NET MVC 3 Framework.我正在关注上传和显示图片的示例.问题是它在将图像上传到产品时工作正常,但如果我以后想要编辑描述然后保存产品图像就会消失.我知道问题在于,在保存产品时我没有传递图像数据,因为图像上传为空,而context.SaveChanges()会保存每个数据字段,包括空图像数据字段.
我被困住了,如果有人能帮助我,我真的很感激! 这是编辑页面的一部分: <label>Image</label>
if (Model.ImageData == null)
{
@:Null
}
else
{
<img id="imageFile" runat="server" src="@Url.Action("GetImage","Product",new { Model.Name })" />
}
<label>Upload image:</label>
<input type="file" name="Image" runat="server" />
更新时: public ActionResult Edit(Product product,HttpPostedFileBase image)
{
if (ModelState.IsValid)
{
if (image != null && image.ContentLength > 0)
{
product.ImageMimeType = image.ContentType;
product.ImageData = new byte[image.ContentLength];
image.InputStream.Read(product.ImageData,image.ContentLength);
}
repository.SaveProduct(product);
TempData["message"] = string.Format("{0} har sparats",product.Name);
return RedirectToAction("Index");
}
else
{
return View(product);
}
}
保存产品: public void SaveProduct(Product product)
{
if (product.ProductID == 0)
{
context.Products.Add(product);
}
else
{
context.Entry(product).State = EntityState.Modified;
}
int result = context.SaveChanges();
}
解决方法
您对问题的理解是正确的:当您将产品标记为EntityState.Modified EF标记其所有属性都已修改.因此,当您的当前产品来自控制器并且没有图像时,EF会在调用SaveChanges()时将其从DB中删除.
我看到两个选择: >您加载原始产品并只更新使用EntityState.Modified所需的属性instread: var productInDb = context.Products.Find(product.Id);
productInDb.Name = product.Name;
productInDb.Description = product.Description;
if (product.ImageData !=null )
{
productInDb.ImageData = product.ImageData;
productInDb.ImageMimeType = product.ImageMimeType;
}
在这种情况下,您必须手动设置产品上的每个属性. context.Entry(product).State = EntityState.Modified;
if (product.ImageData == null)
{
var databaseValues = context.Entry(product).GetDatabaseValues();
product.ImageData = (byte[])databaseValues["ImageData"];
product.ImageMimeType = (string)databaseValues["ImageMimeType"];
}
在这种情况下,您只需要重新设置图像相关属性. 对于这两种实现,在更新期间无法删除ImageData. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
推荐文章
站长推荐
热点阅读
