我有一个带有文件上传控件的表单,它按预期工作。但是我无法弄清楚如何保存'单击提交按钮后选择的文件,如果页面上有其他一些无效字段,则从控制器返回模型? 每次页面上出现错误时,用户都必须再次浏览该文件。在控制器上调用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(视图)但没有输入控件之后,我得到了所有其他字段的正确绑定。
答案 0 :(得分:3)
用户需要重新选择文件的原因是安全措施。您无法设置文件输入的值(如果可以,恶意站点可能包含几百个带有“C:\ password.doc”的隐藏文件输入等,并尝试在用户不知道的情况下下载敏感文件)。
如果模型无效,则需要在返回视图之前保存文件。在我的例子中,我使用的视图模型包含一个对象,该对象包含文件显示名称和路径的属性。基本前提是
Path
的隐藏输入。一个
如果用户更改,则可以将“删除”按钮与此关联
他们的想法,并希望选择一个不同的文件(使用ajax删除
临时文件)