这是我的问题。我已经在我的应用程序中实现了图像的上传和下载。我遇到问题的地方是在验证错误时回发到服务器。发生这种情况时,控制器会重定向回页面并显示所有错误,但HttpPostedFileBase对象为空!所以我必须显示一个"没有图像"图片并强制用户重新上传图片。我想要的是将图像加载回HttpPostedFileBase,这样它就可以再次使用而无需上传任何东西两次!所有其他文本值都会在页面上重新显示,为什么图像不能同样显示? 这可能与代码背后或我必须做一些javascript / ajax类型的东西?有点javascript / ajax的新手所以任何帮助将不胜感激。
这是我的控制器。如果验证失败,我重新显示视图并显示错误,我尝试将HttpPostedFileBase设置回返回的HttpPostedFileWrapper,但是当我第二次回发时它没有工作,该对象为空。因此,如果我重新提交表单,图像仍然是空的。
[HttpPost]
public ActionResult Edit(EditStudentViewModel studentViewModel)
{
if (ModelState.IsValid)
{
//do stuff here
} else
{
var years = Enumerable.Range(DateTime.Now.Year - 99, 100).Reverse();
studentViewModel.Years = years.Select(c => new SelectListItem
{
Text = c.ToString(),
Value = c.ToString(),
Selected = (c == studentViewModel.SelectedYearId)
});
studentViewModel.StudentImageResult =
new FileContentResult(
System.IO.File.ReadAllBytes(
System.IO.Path.GetFullPath(Server.MapPath("~/App_Data/Images/no_image.jpg"))),
"image/jpeg");
// I thought I could reset the httppostedfilewrapper here but it doesn't work
studentViewModel.HttpPostedFileBase= studentViewModel.StudentImageFileBase;
return View(studentViewModel);
}
}
答案 0 :(得分:0)
你做不到。
因为您无法在HTML或JavaScript中设置文件上传的值。
如果可以的话,这将是一个严重的安全漏洞,因为理论上你可以恶意上传整个硬盘。
然而,您可以在发送之前使用JavaScript进行验证。 然后你不需要Post-Back,无论如何都是用户友好的。
否则,如果验证失败,您可以保存文件,并在标签中显示名称,并在隐藏的输入字段中显示图像的id / uid。
答案 1 :(得分:0)
如果验证失败,为什么不将文件本地存储在服务器上的临时位置并使用
显示图像@Html.Image("Name", Url.Content("~/Images/TempLocation/temp.jpg"), "Picture")
重新发布时,如果模型有效,您可以将“temp.jpg”从临时位置保存到您的应用程序中。