我在使用ASP.NET MVC上传之前,正在使用文件API在客户端预览配置文件图像。 但是,问题是在发布操作后图像预览会丢失,并且在出现验证错误时会返回默认图像。
如果存在验证错误,我想保留以前的图像预览以及验证错误消息。怎么可以这样做?
问题:
问题是由于验证后清除输入文件类型的原因。因此,文件api无法重新填充图像,因为验证后实际上不存在文件。
那么,我想这个问题可以简化为如何在验证后保留输入类型=文件值?
答案 0 :(得分:0)
你需要做一些事情:
更改模型,使其具有两个新属性:
ChangeImage
:这应该绑定到允许用户提供新图像的复选框ImagePresent
:这表示用户之前(在之前的POST中)已经发布了一张图片以这种方式更改控制器的操作:
ChangeImage
应为true,以便用户可以选择新文件,ImagePresent
应为false,以便Razor模板知道服务器上没有要显示给用户的图像ChangeImage
并提供文件图像,请将其保存在服务器上,例如保存在文件上,以便以后可以向用户显示。如果存在验证错误,请向用户返回包含值ChangeImage = false
和ImagePresent = true
ImagePresent
设置为true,将ChangeImage
设置为false。这样,它将使用剃刀模板显示。ChangeImage
并选择无文件或在视图模型中使用新的RemoveImage
属性来允许用户删除图像更改剃刀模板:
*为ChangeImage
添加一个复选框,以便允许用户指定新的图像文件(或指定一个空文件来删除它)。理想情况下,您应该添加一些JavaScript代码来显示/隐藏文件输入控件。如果用户想要添加图像,则必须检查ChangeImage
并选择新文件
*可选地,为RemoveImage
添加一个复选框,仅在ImagePresent
为真时显示
*添加<img>
,仅在ImagePresent
为真时显示
如果您这样做,则用户必须仅在第一次上传图像,除非他想要删除或更改图像。并且您可以在服务器中使用它来显示它。
我们的想法是将图像保留在服务器上,并告知模板是否可用。请记住,通过安全性,您无法在浏览器中指定文件输入控件的文件名,因此您必须使用替代控件,如上所述。
答案 1 :(得分:-1)
使用Ajax Submit方法提交,下面是示例代码...
@using (Ajax.BeginForm("/SaveDetails", "User",
new AjaxOptions { UpdateTargetId = "divSaveUsers", InsertionMode = InsertionMode.Replace,
OnSuccess = "onUserSaveSuccess", OnFailure = "onUserSaveFailure", HttpMethod = "POST" },
new { @autocomplete = "off", @id = "frmuserdetails" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
<input type="button" value="Save" id="btnSaveUserData" />
}
<script>
$("#btnSaveUserData").click(function (event) {
if ($("#frmuserdetails").valid()) {
$("#frmuserdetails").unbind("submit").submit();
}
});
</script>
如果不存在,请添加jquery.unobtrusive-ajax.js的引用。
如果您遇到任何问题,请告诉我。
由于
Raviranjan