编辑具有文件的实体-默认模型活页夹混淆

本文关键字:模型 默认 文件 实体 编辑 | 更新日期: 2023-09-27 18:25:35

我有一个类似的模型

public class FileDetail 
{
    public string Url { get; set; }
    [NotMapped]
    public HttpPostedFileBase File { get; set; }
    public void UploadFile()
    {
        if (File != null)
        {
        try
        {
                ...
                Url = "data:image/png;base64," + Convert.ToBase64String(objImageBytes);
            }
        }
        catch (Exception ex)
        {
        }
    }
}

我有这样的编辑/创建视图

...
@model ApplicationBase.Core.Common.FileDetail
@Html.TextBoxFor(x => x.File, new { type = "file", accept = "*" })
...

当我执行编辑操作时,默认模式绑定器将文件属性加载为字符串,

Request.Form
{File=17382.jpg}

当我执行创建操作时,默认模式绑定器将文件加载为HttpFileCollectionWrapper

Request.Form
{}
Request.Files
{System.Web.HttpFileCollectionWrapper}
    AllKeys: {string[1]}
    Count: 1

为什么会发生这种情况?这应该始终是HttpFileCollectionBase,但当我创建一个新实体时,它运行得很完美,然后当我编辑同一实体时,将File属性绑定为字符串而不是文件?

这里有什么问题?

已编辑

我不将File属性保存到数据库。我只使用它从输入字段绑定文件类型,然后运行UploadFile方法。该方法获取文件并创建一个base64字符串,然后将其放入FileDetail的Url属性中。

然后我将实体保存到数据库中。

编辑2

    [HttpPost, ActionName("Create")]
    public ActionResult CreateConfirmed(FileDetail Detail)
    {
    ...
    }
    [HttpPost]
    public ActionResult Edit(FileDetail Detail)
    {
    }

编辑具有文件的实体-默认模型活页夹混淆

确保您的视图具有如下多部分形式:

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