MVC 5 - 尝试通过编辑操作修改图像失败

时间:2016-12-13 19:41:49

标签: c# asp.net-mvc asp.net-mvc-5

这是我的模型类

public class Data
{
    public int ID { get; set; }
    public string Name { get; set; }
    public byte[] Image { get; set; }
}

这是我的编辑HttpPost方法

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "ID,Name,Image")] Data data, HttpPostedFileBase image1)
{
    if(ModelState.IsValid)
    {
        if(image1 != null)
        {
            data.Image = new byte[image1.ContentLength];
            image1.InputStream.Read(data.Image, 0, image1.ContentLength);
        }
        else
        {
            data.Image = db.Data.Find(data.ID).Image;
        }

        db.Entry(data).State = EntityState.Modified;
        db.SaveChanges();
        return RedirectToAction("Index");
   }

   return View(data);

}

我的问题是,在编辑HttpPost中如果我没有指定新的图像文件,那么在尝试保存时我会收到以下错误。

Error

但是,如果我在“编辑”页面中提供新图像,则代码可以正常工作。

如果你能告诉我这里做错了什么,我非常感激。

谢谢。

2 个答案:

答案 0 :(得分:2)

好像你有点颠倒了。 好像你只是更新名称和图像,如果提供的话。 而我 - 你一直都有。 为什么不这样做:

if(ModelState.IsValid)
{
     var dbData = db.Data.Find(data.ID);
     dbData.Name = data.Name

     if(image1 != null)
     {
          dbData.Image = new byte[image1.ContentLength];
          image1.InputStream.Read(dbData.Image, 0, image1.ContentLength);
     }              

        db.SaveChanges();
        return RedirectToAction("Index");
}

return View(data);

并在需要时进行优化。

答案 1 :(得分:2)

您没有使用上下文附加对象,所以发生的事情是它尝试插入新行而不是更新,您需要这样做:

db.Data.Attach(data);
db.Entry(data).State = EntityState.Modified;
db.SaveChanges();