显示进度条,显示表单提交的进度

2023-11-26

这个问题还没有完全解答,欢迎大家踊跃留言!


我正在尝试显示一个简单的progress bar提交大表格时。

该表单包含十几个字段,以及一些文件上传字段,用户可以在其中选择图片。然后,当他点击Create按钮,提交带有数据和图片的表单,并在数据库中创建实体。 (只需单击一下即可提交表格和图片)。
一切正常,但我想在提交过程中显示进度条。

我已经发现a lot很多教程解释了如何显示进度条,但我没有找到任何人解释如何显示进度条,指示方法完成的工作百分比,即,我希望在提交过程中看到 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> in a progressBar显示上传进度状态 ?


这是我的要求:

  • 没有插件(这是一个个人项目,我想了解如何自己做到这一点)。
  • 交叉兼容,IE8+(如果可能)
  • jQuery 可以,但没有 Flash。


非常感谢 !

UPDATE 1这里有一个JSFIDDLE,我正在努力适应的地方这个链接但没有成功...如果您认为您可以提供帮助,不客气!


UPDATE 2好的,我用过阿卡隆的回答提交我的表格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发送有这些字段:

就绪状态:4
status: 0

并且在error handler,我有这些价值观:

已加载:0
总计:883526
类型:“错误”

所以数据被提交到我的控制器,但我无法显示这个该死的进度条......


您可以使用XMLHttpRequest上传文件时接收更新。还有各种 jquery 类型的包装器可以实现相同的目的。我将使用描述一个解决方案XMLHttpRequest。 首先拦截表单提交。

$("#target-form").submit(function () {

然后创建XHR请求:

 xhr = new XMLHttpRequest();

然后注册以获得有关进度事件的通知:

xhr.upload.addEventListener( "progress", function ( evt )
{
    if( evt.lengthComputable )
    {
        var progressPercent = ( evt.loaded / evt.total ) * 100;
        showProgress( value );//your function.
    }
}, false );


//Some other events you will probably want to subscribe to
xhr.addEventListener( "load", function ()
{            
    fileUploadComplete( this.responseText );
}, false );

xhr.addEventListener( "error", function ( first, second, third )
{
    fileUploadComplete( "Error: Image format not supported." );
}, false );

xhr.addEventListener( "abort", function ()
{
    fileUploadComplete( "Error: Upload was cancelled. Please try again." );
}, false );

打开 XHR 传递任何参数 (id作为示例显示)

xhr.open( "post", '@Html.Raw( @Url.Action( "UploadImage", new { someId = id } ) )', true );

// Set appropriate headers                
xhr.setRequestHeader( "Content-Type", "multipart/form-data" );
xhr.setRequestHeader( "X-File-Name", name );

// Send the file
xhr.send( file );

然后在控制器中:

public ActionResult UploadImage( int someId, HttpPostedFileBase userFile  )
{
    ...    
}

您将在更新处理程序中收到更新。

长时间运行的服务器任务的扩展

如果服务器上有一些长时间运行的任务(例如将数据写入数据库),那么您需要对服务器上的操作进行分块(以便您可以在完成每个块时提供更新)并实现代码来处理您可以从 javascript 查询长期运行的服务。看here。基本思想是在服务器端启动任务并定期检查 Javascript 的进度。您可能需要两个单独的进度条,一个用于上传,一个用于服务器端操作。这为用户提供了更多信息 - 他们将知道文件上传已完成并且现在正在发生一些服务器端操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

显示进度条,显示表单提交的进度 的相关文章

随机推荐

  • 使用jedis如何写入redis集群中的特定槽/节点

    我正在尝试提高将数据写入redis集群的性能 我们计划从 redi sentinel 迁移到集群模式以实现可扩展性 但是 与redis sentinel相比 写操作的性能要差很多 我们在redis sentinel中利用了管道 但集群模式不
  • 在 PHP 中迭代复杂的关联数组

    有没有一种简单的方法可以在 PHP 中迭代此结构的关联数组 数组 searches有一个编号索引 包含 4 到 5 个关联部分 所以我不仅需要迭代 searches 0 通过 searches n 但是也 searches 0 part0
  • 获取有关 MATLAB com.mathworks 内部结构的帮助

    可以访问 MATLAB 的内部 java 代码位 以编程方式更改 MATLAB 本身 例如 您可以使用以下命令以编程方式在编辑器中打开文档 editorServices com mathworks mlservices MLEditorSe
  • UITableView自定义滚动条

    如何为 UITableView 创建自定义滚动条 我想删除跟踪开始时弹出并在跟踪结束时消失的默认选项 相反 我想要一个类似于计算机程序中的程序 a 它位于屏幕的右侧并且永久可见 b 手动滚动栏会将 UITableView 滚动到适当的位置
  • 禁用特定 GDI 设备上下文的抗锯齿功能

    我正在使用第三方库将图像渲染到 GDI DC 并且我需要确保渲染任何文本时都不会进行任何平滑 抗锯齿 以便我可以将图像转换为具有索引颜色的预定义调色板 我用于渲染的第三方库不支持此功能 并且仅根据当前 Windows 设置的字体渲染来渲染文
  • 如何在 Haskell 中使用策略编写并行归约?

    在高性能计算中 总和 乘积等通常使用 并行归约 来计算 该方法需要n元素并在 O logn 时间 给定足够的并行性 在 Haskell 中 我们通常使用fold对于这种计算 但评估时间始终与列表的长度呈线性关系 Data Parallel
  • 固定宽度整数类型是否保证是标准内置类型的 typedef?

    类型是否来自
  • 如何在写入后清除 PrintWriter 的内容

    晚上好 我想知道如何清除写入PrintWriter的数据 即打印后是否可以从PrintWriter中删除数据 在此 servlet 中 我将一些文本打印到响应中 并在 表示的行处 我想删除所有以前打印的数据并打印新内容 protected
  • Kivy 布局高度适应子部件的高度

    我想创建一个布局 其中有类似于 BoxLayout 的内容 以便我能够在布局中创建 行 并且在每个 行 中我想使用另一个 BoxLayout 中的某些内容来创建 列 列不需要均匀分布 例如 我想创建一个 BoxLayout 其中一列带有方形
  • 如何在codeigniter中的hmvc中的另一个模块中加载模型?

    我想在我的项目中使用模块化扩展 HMVC 如下所示 modules module01 models models01 php controllers controller01 php views views01 php module02 m
  • 我应该切换到Python吗? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我最近一直在考虑转向Python编程语言 目前 Matlab 是我所在部门用于快速开发和
  • 在 WPF C# TreeView 中获取子节点的父节点

    我知道使用 WPF 进行 C 编程与传统的 C 程序不同 因此大多数在线材料都没有说明我需要什么 我的 WPF 窗口中有一个 TreeView 控件 其中有父节点和子节点 我想将它们存储在 Node 类型的列表中 id name paren
  • 如果命令绑定解析为 null,为什么按钮会启用?

    好的 XAML 非常简单 使用 MVVM 绑定到ICommand SomeCommand get 视图模型上的属性
  • 我的程序如何从 ASCII 切换到 Unicode?

    我想用 C 编写一个可以在 Unix 和 Windows 上运行的程序 该程序应该能够使用 Unicode 和非 Unicode 环境 它的行为应该仅取决于环境设置 我想要的一个很好的功能是操作从目录中读取的文件名 这些可以是 unicod
  • 如何在C++中读取格式化数据?

    我已将数据格式化如下 Words 5 AnotherWord 4 SomeWord 6 它在一个文本文件中 我使用 ifstream 来读取它 但如何分离数字和单词 该单词仅由字母组成 单词和数字之间会有一定的空格或制表符 不确定有多少 假
  • 为什么 CDATA 在脚本标签下被注释掉?

    我正在读这个question我有一个相关的问题 这家伙here说 它用在脚本标签中以避免解析 already CDATA Question 1 如果脚本是already CDATA 为什么它 在脚本标签下 仍然呈现为 CDATA Quest
  • Sql Server 中的“IN”子句限制

    有谁知道 IN 子句的表达式列表 用于测试匹配 中可以拥有的值的数量限制是多少 是的 有限制 但是微软仅指定其位于 数千 在 IN 子句中的括号内显式包含大量值 数千个用逗号分隔的值 可能会消耗资源并返回错误 8623 或 8632 要解决
  • 我在哪里可以获得线程安全的 CollectionView?

    在后台线程上更新业务对象集合时 我收到以下错误消息 这种类型的 CollectionView 不支持从与 Dispatcher 线程不同的线程更改其 SourceCollection 好吧 这是有道理的 但它也引出了一个问题 什么版本的 C
  • Java 中原始整数类型的行为不一致

    有人可以向我解释一下 就像我五岁一样 为什么我在 Java 中表示整数的四种基本类型中的两种会得到不同的行为 AFAIK 所有四个都是有符号的 并且它们都使用最高有效位作为符号位 那么为什么 byte 和 Short 表现正常 而 int
  • 显示进度条,显示表单提交的进度

    这个问题还没有完全解答 欢迎大家踊跃留言 我正在尝试显示一个简单的progress bar提交大表格时 该表单包含十几个字段 以及一些文件上传字段 用户可以在其中选择图片 然后 当他点击Create按钮 提交带有数据和图片的表单 并在数据库