我正在研究MVC / EF Web应用程序.在其中一种形式中,我编辑了一个模型.该模型有一个图像字段(public byte [] BioPhoto)
当我将图像上传到该字段并保存数据时,ModelState.IsValid为false,因为ModelState中的BioPhoto属性为null.请注意,模型中的BioPhoto加载了图像数据.
我尝试使用下面的代码将图片注入ModelState,但仍然是ModelState.IsValid为false
public ActionResult Edit([Bind(Include = "BusinessId,Name,About,Phone,TollFree,FAX,Email,Bio,BioPhoto")] Business business)
{
if (System.IO.File.Exists("image.jpg"))
{
business.BioPhoto = System.IO.File.ReadAllBytes("image.jpg");
ModelState.SetModelValue("BioPhoto",
new ValueProviderResult(business.BioPhoto, "", System.Globalization.CultureInfo.InvariantCulture));
}
if (ModelState.IsValid)
{
db.Entry(business).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(business);
}
我究竟做错了什么.这个问题有更好的解决方案吗?
我在SO中读了几个答案,但无法弄清楚如何解决我的情况.
这是我的模特
public class Business
{
public int BusinessId { get; set; }
[Required]
[StringLength(100)]
public string Name { get; set; }
[Required]
public Address address { get; set; }
[Required]
[StringLength(20)]
public string Phone { get; set; }
[StringLength(20)]
public string TollFree { get; set; }
[StringLength(20)]
public string FAX { get; set; }
[Required]
[StringLength(50)]
public string Email { get; set; }
[Required]
[StringLength(100)]
public string WebSite { get; set; }
[Required]
public string About { get; set; }
[Required]
public string Bio { get; set; }
[Required]
public byte[] BioPhoto { get; set; }
}
我的看法
<div class="form-group">
@Html.LabelFor(model => model.BioPhoto, "BIO Photo (Best Size: 350 x 450)", htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
<form enctype="multipart/form-data">
<div class="form-group" style="width:400px">
<input id="BioPhoto" type="file" multiple class="file" data-overwrite-initial="false" />
</div>
</form>
@Html.ValidationMessageFor(model => model.BioPhoto, "", new { @class = "text-danger" })
</div>
</div>
最佳答案 就像我说的那样,问题是表格不是将BioPhoto发布到控制器 – 最有可能.您可以使用Chrome查看http请求正文中的内容.
如果您想要添加图像,即使控制器没有收到它,请尝试这样做.
尝试仅删除与image属性相关的错误:
ModelState["BioPhoto"].Errors.Clear();
然后添加图像:
business.BioPhoto = System.IO.File.ReadAllBytes("image.jpg");
然后更新模型:
UpdateModel(business);
现在,如果您调用ModelState.IsValid,它将考虑BioPhoto的设置并重新评估IsValid.
编辑:
我建议打电话
ModelState.SetModelValue("BioPhoto", new ValueProviderResult(business.BioPhoto, "", System.Globalization.CultureInfo.InvariantCulture));
实际将值推送到ModelState.Values.但这不是必要的.