如何在视图上保留 HttpPostedFileBase Return

How to Retain HttpPostedFileBase on View Return

我有以下型号:

public string Content { get; set; }
public HttpPostedFileBase LogoImageFile { get; set; }

查看:

 @Html.EditorFor(model => model.Content, new { htmlAttributes = new { @class = "form-control" } })
 <div class="uploaded-img-wrapper hidden">
   <img class="img-thumbnail-md" title="logo image" alt="logo image" />
 </div>
 @Html.TextBoxFor(model => model.LogoImageFile, new { type = "file", @class = "image-upload" })

当用户 select 使用文件输入元素中的 'choose file' 按钮从本地驱动器中获取照片时,图像将通过 javascript 显示在屏幕上(图像将如果表单有效并提交,则保存到服务器):

if (input.files && input.files[0]) {
            var reader = new FileReader();
            reader.onload = function (e) {
                var $wrapper = $(input).prev();
                $wrapper.removeClass('hidden');
                $wrapper.find('img').attr('src', e.target.result).removeAttr('title');
                $(input).addClass('hidden');
            }
            reader.readAsDataURL(input.files[0]);
        }

我对 "Content" 文本框进行了服务器端验证。如果服务器端验证失败并且 return View(Model); 被调用,则文件输入中的图像将消失。有谁知道如何在返回View时将文件保留在页面上吗?

我有两个解决你问题的方法:

远程验证:

根据下面的句子 "I have a server side validation for the Content textbox",在我看来,您可以使用远程验证来验证您的表单,而不是将您的表单发送到 server.This link 可以帮助您使用远程验证(我会推荐这个)。

临时店铺

在此解决方案中,您必须使用启用ajax 的文件上传组件(例如this)将一个或多个文件发送到服务器。然后你必须准备一个动作来接收文件并将其保存在临时存储中,例如(缓存或文件系统)并生成一个文件引用来恢复保存的文件,最后 return 文件引用到 client.The 客户端将接收到的文件引用作为隐藏输入插入到表单中,因此每次发送表单时,发送文件引用而不是文件 content.Of 当然有两点需要注意:

1) 准备一个操作以根据用户请求取消选定的文件

2) 准备一个api 用于通过文件引用恢复临时文件

3) 管理临时文件以确保它们不会填满您的存储空间(如果使用 asp.net 缓存作为临时存储空间,IIS 本身会处理它)。

public ActionResult UploadTemporary(HttpPostedFileBase file)
{
    Guid reference = Guid.NewGuid();
    string extension = Path.GetExtension(file.FileName);
    string fullName= reference.ToString()+extension;
    var path = Path.Combine(Server.MapPath("~/Content/TempFiles/"), fullName);

    var data = new byte[file.ContentLength];
    file.InputStream.Read(data, 0, file.ContentLength);

    using (var sw = new FileStream(path, FileMode.Create))
    {
        sw.Write(data, 0, data.Length);
    }

    return Content(reference);
}

总结

如果你在你的项目中遇到一些这样的需求案例,第一个解决方案是快速和简单的,但如果你遇到很多这样的案例,我建议你使用第二个 solution.The 第二个解决方案非常耗时,但对于大量处理文件的应用程序非常有用。