Asp.net mvc 当未指定新图像时,Html.BeginForm POST是否覆盖图像数据?
这是我第一次向StackOverflow发帖。我希望这是有用的 我有一个Razor视图,用于编辑包含预定义值或空值的模型的可显示属性。视图不应更改模型属性的内容,除非用户根据视图在UI中对其进行编辑,从而有意对其进行更改。视图的行为正常,但包含图像数据的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
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);
....