c# – 无法使用SetModelValue修改ModelState

我正在研究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.但这不是必要的.

点赞