如何在视图上保留 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 第二个解决方案非常耗时,但对于大量处理文件的应用程序非常有用。
我有以下型号:
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 第二个解决方案非常耗时,但对于大量处理文件的应用程序非常有用。