Asp.net mvc 当未指定新图像时,Html.BeginForm POST是否覆盖图像数据?

Asp.net mvc 当未指定新图像时,Html.BeginForm POST是否覆盖图像数据?,asp.net-mvc,asp.net-mvc-4,post,razor,html.beginform,Asp.net Mvc,Asp.net Mvc 4,Post,Razor,Html.beginform,这是我第一次向StackOverflow发帖。我希望这是有用的 我有一个Razor视图,用于编辑包含预定义值或空值的模型的可显示属性。视图不应更改模型属性的内容,除非用户根据视图在UI中对其进行编辑,从而有意对其进行更改。视图的行为正常,但包含图像数据的byte[]类型的属性除外:Model.ImageData @using (Html.BeginForm("Edit", "Admin", FormMethod.Post, new { enctype = "multipart/form-data

这是我第一次向StackOverflow发帖。我希望这是有用的

我有一个Razor视图,用于编辑包含预定义值或空值的模型的可显示属性。视图不应更改模型属性的内容,除非用户根据视图在UI中对其进行编辑,从而有意对其进行更改。视图的行为正常,但包含图像数据的
byte[]
类型的属性除外:
Model.ImageData

@using (Html.BeginForm("Edit", "Admin", FormMethod.Post, new { enctype = "multipart/form-data" } ))
{

@Html.EditorForModel()

<div class="editor-label">Image</div>
<div class="editor-field">
    @if (Model.ImageData == null)
    {
        @: No image has been assigned in the database.
    }
    else
    {
        <img width="150" height="150" src="@Url.Action("GetImage", "Product", new { Model.ID} )" />
    }
    <div>Upload new image: <input type="file" name="Image" /></div>
</div>

<input type="submit" value="Save" />

}
下面是更新模型的响应代码(尽管在调用此代码之前模型正在更改):


<>我做错了什么?

< p>这是你应该考虑使用<代码> VIEWSMODS类的地方。但要使您当前的工作方式保持最少的更改,请尝试将
SaveProduct()
方法修改为以下内容:

public void SaveProduct(Product product, bool updateImage = false)
{
    context.Products.Attach(product);

    // mark product as modified
    var entry = context.Entry(product);
    entry.State = EntityState.Modified;

    entry.Property(e => e.ImageData).IsModified = updateImage;
    entry.Property(e => e.ImageMimeType).IsModified = updateImage;   

    context.SaveChanges();  
}
并将控制器代码修改为:

...
var updateImage = false;
if (Image != null)
{
    updateImage = true;
    product.ImageMimeType = Image.ContentType; 
    product.ImageData = new byte[Image.ContentLength]; 
    Image.InputStream.Read(product.ImageData, 0, Image.ContentLength); 
}
repository.SaveProduct(product, updateImage);
....

您需要在控制器数据中包含最小的代码,即设置/保存模型数据。您是否正在使用
UpdateModel()
?然后添加
SaveProduct()
方法。是EntityFrameworks,Linq到Sql(dbml)?@arserbin3模型是EF。但是请注意控制器代码中
edit()
的两个重载中关于模型属性的注释-调用
repository.SaveProduct
之前,
ImageData
属性设置为null(似乎模型是由框架以某种方式修改的)…不,模型不是“由框架修改的”。模型只是从
编辑(产品,…)
自动绑定的内容。因此,如果您不在视图中包含
model.Price
,例如,自动绑定将具有
Price=null
而不是
Price=whatever in db
@arserbin3:有一个观察结果与您的陈述“自动绑定将具有Price=null而不是Price=whatever in db”不一致:传递给
View()
方法的模型
product
包含数据。如果在
POST
之前未编辑数据,则没有要自动绑定的新数据。但是,大多数属性根本不受影响。这就是问题所在——自动绑定器不会将所有属性(如
Price
Name
)设置为null。除了
ImageData
属性外,模型
product
中的所有属性与执行
View()
方法之前相同。
public void SaveProduct(Product product, bool updateImage = false)
{
    context.Products.Attach(product);

    // mark product as modified
    var entry = context.Entry(product);
    entry.State = EntityState.Modified;

    entry.Property(e => e.ImageData).IsModified = updateImage;
    entry.Property(e => e.ImageMimeType).IsModified = updateImage;   

    context.SaveChanges();  
}
...
var updateImage = false;
if (Image != null)
{
    updateImage = true;
    product.ImageMimeType = Image.ContentType; 
    product.ImageData = new byte[Image.ContentLength]; 
    Image.InputStream.Read(product.ImageData, 0, Image.ContentLength); 
}
repository.SaveProduct(product, updateImage);
....