微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

asp.net-mvc-3 – 在mvc 3中上传成功的图像,但编辑图像时会消失

我正在阅读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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐