加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

在这种情况下,您必须手动设置产品上的每个属性.
>将产品标记为已修改后,重新设置db中的图像值:

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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读