我有一个带有图片和其他几个字段的页面。上传图片工作正常。如果用户想要编辑并放置不同的图片,那也可以正常工作。当用户编辑记录中的其他字段(图像字段除外)时,会出现此问题。保存后,图像消失。
这是我的控制器
public ActionResult Edit([Bind(Include = "GlobalMaterialId,Length,Picture")] MetalStock metalStock, HttpPostedFileBase ImageFile)
{
if (ModelState.IsValid)
{
if (ImageFile != null)
{
string pic = System.IO.Path.GetFileName(ImageFile.FileName);
metalStock.ImagePath = pic;
using (MemoryStream ms = new MemoryStream())
{
ImageFile.InputStream.CopyTo(ms);
metalStock.Picture = ms.GetBuffer();
}
}
m_db.Entry(metalStock).State = EntityState.Modified;
m_db.SaveChanges();
return RedirectToAction("Index");
}
return View(metalStock);
}
这是视图的图像上传位
<输入名称=" ImageFile"类型='文件' />
据我所知,当我编辑一个字段并保存时,传递给控制器的ImageFile是空的并且会产生问题。我尝试了一些其他的东西,比如试图从记录中获取图片并将其重新分配给对象等。他们没有工作。请帮忙。
答案 0 :(得分:0)
我猜你的控制器会死,因为它寻找一个HttpPostedFile并且没有得到它。 您可以在行动声明
中使其可以为空public ActionResult Edit([Bind(Include = "GlobalMaterialId,Length,Picture")] MetalStock metalStock, HttpPostedFileBase ImageFile = null)
或者根本不在控制器中声明它并从请求中提取它:
var Image = Request.Files["ImageFile"]
答案 1 :(得分:0)
您可以将现有图像文件存储在隐藏字段中作为base64字符串,并在后期操作检查中查看HttpPostedFileBase是否为空(他们没有选择不同的图像)。如果是,将base64字符串转换回字节数组并将其分配给metalStock.Picture属性。
这就是我过去处理这种情况的方式。您需要在viewmodel上创建另一个属性来保存此base64字符串。假设您的视图不直接绑定到您的实体,而是视图模型,则这是有益的。