如果验证在ASP.Net MVC视图中失败,请设置httppostedfilebase

时间:2015-02-16 22:14:10

标签: javascript ajax asp.net-mvc image-uploading

这是我的问题。我已经在我的应用程序中实现了图像的上传和下载。我遇到问题的地方是在验证错误时回发到服务器。发生这种情况时,控制器会重定向回页面并显示所有错误,但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);
        }
    }

2 个答案:

答案 0 :(得分:0)

你做不到。
因为您无法在HTML或JavaScript中设置文件上传的值。
如果可以的话,这将是一个严重的安全漏洞,因为理论上你可以恶意上传整个硬盘。

然而,您可以在发送之前使用JavaScript进行验证。 然后你不需要Post-Back,无论如何都是用户友好的。

否则,如果验证失败,您可以保存文件,并在标签中显示名称,并在隐藏的输入字段中显示图像的id / uid。

答案 1 :(得分:0)

如果验证失败,为什么不将文件本地存储在服务器上的临时位置并使用

显示图像
@Html.Image("Name", Url.Content("~/Images/TempLocation/temp.jpg"), "Picture")

重新发布时,如果模型有效,您可以将“temp.jpg”从临时位置保存到您的应用程序中。