MVC文件上载保存所选文件

时间:2015-03-25 16:51:15

标签: asp.net-mvc asp.net-mvc-4

我有一个带有文件上传控件的表单,它按预期工作。但是我无法弄清楚如何保存'单击提交按钮后选择的文件,如果页面上有其他一些无效字段,则从控制器返回模型? 每次页面上出现错误时,用户都必须再次浏览该文件。在控制器上调用POST后保存选择的最佳实践方法是什么?

//VIEW
@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" }))
{
  <input id="inputbox" type="file" name="PageUpload" />
  @Html.TextBoxFor(model => model.otherField1)
  @Html.TextBoxFor(model => model.otherField2)
}

//CONTROLLER
[HttpPost]
public ActionResult Create(MyViewModel view)
{
    try
    { ...
        if (ModelState.IsValid)
        {
            //it is valid save
            return RedirectToAction("Action", "Controller", new { id = view.ModelID });
        }
    }
    catch(Exception e){}
    return View(view);
}

在返回View(视图)但没有输入控件之后,我得到了所有其他字段的正确绑定。

1 个答案:

答案 0 :(得分:3)

用户需要重新选择文件的原因是安全措施。您无法设置文件输入的值(如果可以,恶意站点可能包含几百个带有“C:\ password.doc”的隐藏文件输入等,并尝试在用户不知道的情况下下载敏感文件)。

如果模型无效,则需要在返回视图之前保存文件。在我的例子中,我使用的视图模型包含一个对象,该对象包含文件显示名称和路径的属性。基本前提是

  1. 将文件保存到临时位置
  2. 使用文件路径更新视图模型(到临时模式) 位置)和显示名称
  3. 返回视图
  4. 在视图中,渲染显示名称(以便用户知道哪个文件 已被选中)和Path的隐藏输入。一个 如果用户更改,则可以将“删除”按钮与此关联 他们的想法,并希望选择一个不同的文件(使用ajax删除 临时文件)
  5. 如果模型状态在发布时有效,请获取基于临时路径 关于隐藏输入的值并将文件移动到其永久性 位置,然后保存模型并重定向。