我有以下代码用于将大文件(~6MB)上传到 ASP .NET MVC2 应用程序。文件上传后,控制器可能需要 5 分钟才能返回响应。
在此期间,IE9 不会显示任何处理尚未完成的迹象,即用户可以选择其他文件并重新发布。
您如何通知用户操作未完成并禁用提交按钮,直到旧文件处理完成?
<% using (Html.BeginForm("InvoiceImport", "Grid",
FormMethod.Post, new { enctype = "multipart/form-data" }))
{%>
<input name="uploadFile" type="file" />
<input type="submit" name='invoice' value='Read'/>
<%} %>
控制器:
[AcceptVerbs(HttpVerbs.Post)]
[Authorize]
ActionResult ImportFromFile(HttpPostedFileBase uploadFile)
{
Server.ScriptTimeout = 30 * 60;
var res = ImportFromFile(uploadFile.InputStream); // takes lot of time
TempData["Message"] = uploadFile.FileName + " Readed records " + res;
return RedirectToAction("Complete");
}
更新
我看起来最重要的问题是防止重复提交。我尝试了下面的代码来防止重复提交,但由于未知原因,如果第二次按下提交按钮,则 Session["Upload"] 为空。如何防止重复提交?
View added
<% if (TempData["Message"]!=null) { %>
setTimeout( function() {
showMessage ( '<%= TempData["Message"] as string %>');
}, 300 );
<% } %>
Controller
ActionResult ImportFromFile(HttpPostedFileBase uploadFile)
{
if (Session["Upload"] != null)
{
// todo: why this point is never reached ?
TempData["Message"] = Session["Upload"] + " Please wait file is being processed";
return View();
}
Session.Add("Upload", uploadFile.FileName);
Server.ScriptTimeout = 30 * 60;
ImportFromFile(uploadFile.InputStream);
TempData["Message"] = uploadFile.FileName + " completed";
Session.Remove("Upload");
return RedirectToAction("Complete");
}