我想在提交一个大表单时显示一个简单的进度条。
这个表单包含十几个字段和一些文件上传字段,用户可以选择图片。然后,当他点击 Create
按钮时,数据和图片被提交,并在数据库中创建实体。(只需一次点击即可提交表单和图片)。
一切都很顺利,但我想在提交过程中显示一个进度条。
我找到了许多教程,解释如何显示进度条,但我没有找到任何人解释如何显示指示方法完成工作百分比的进度条,例如,我希望在提交过程中看到10%、25%等等..
所以,基本上,这就是我做的:(这是一个ASP.NET MVC3项目)
@model MyModel
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "target-form", enctype = "multipart/form-data" }))
{
//some Html.TextBoxFor() and other @Html.DropDownListFor
@Html.TextBoxFor(m => m.File, new { type = "file"})
<input type="submit" value="Create" class="submitButton" />
<div id="progressBar"></div>
}
一个基本的控制器
[HttpPost]
public ActionResult Create(MyModel model)
{
if (ModelState.IsValid)
{
DALLayer dal = new DALLayer()
dal.AddEntity(model);
return RedirectToAction("Index", "Home");
}
return null;
}
是否可以将我的最后一个<div>
转换为一个显示上传进度状态的progressBar
?
以下是我的要求:
- 无插件(这是一个个人项目,我想自己学习如何完成)。
- 跨浏览器兼容,支持IE8+(如果可能的话)
- jQuery可行,但不使用Flash。
非常感谢!
更新1
这里是一个JSFIDDLE,我正在尝试调整此链接,但没有成功...如果你认为你能帮忙,欢迎联系我!
更新2
好的,我使用了acarlon的答案来通过XMLHttpRequest
提交表单,并且数据已经被正确地提交到控制器。然而,进度条仍然没有出现!
我只是替换了传递给控制器的数据:
formData = new FormData(document.getElementById("target-form") );
xhr.open("POST", "@Url.Action("MyMethod", "MyController")", true );
尝试一些不同的标题,例如:
xhr.setRequestHeader("X-File-Name", $('#Files_0__File')[0].files[0].name);
xhr.setRequestHeader("X-File-Size", $('#Files_0__File')[0].files[0].size);
xhr.setRequestHeader("X-File-Type", $('#Files_0__File')[0].files[0].type);
//Also tried with "Content-Length" but it doesn't care about it.
这里硬编码确保它有良好的值。当我更加熟悉它时,我将在循环中执行它。
当我提交表单时,XMLHttpRequest
发送以下字段:
readyState: 4
status: 0 <= 应该是200,对吧?
在错误处理程序
中,我有以下值:
loaded: 0
total: 883526
type: "error"
因此,数据已提交到我的控制器,但我无法显示这个可恶的进度条...