【问题标题】:How to stop an Loading function on button click?如何在按钮单击时停止加载功能?
【发布时间】:2011-10-30 12:04:15
【问题描述】:

我有一个问题,我必须在按钮单击时停止一个加载类。我已经检查了一些与此相关的论坛。但没有找到确切的解决方案。

例如:

Public Sub LoadDropDown()
   Dim it As Integer
   For it = 0 To 1000000
      DropDownList1.Items.Add(it)
   Next
End Sub

我必须在单击加载按钮时加载下拉菜单,并且必须在单击取消按钮时取消它。

【问题讨论】:

  • 感谢 @Waqas 格式化 OP 的代码示例
  • @Rajsmethode:我希望你没有认真考虑构建这么多 DropDownList 项?!你知道这也必须发送到客户端并从浏览器呈现吗?
  • 是的,我知道,我只是举了一个下拉列表的例子,我有类似的问题,用户想取消加载一个网格视图。我已经使用 javascript abortPostBack() 方法完成了 ajax 更新面板。但它会停止回发,服务器端代码将一直工作到事件完成。能给我点意见吗?

标签: asp.net vb.net asp.net-ajax


【解决方案1】:

由于填充控件发生在服务器上,我无法想象如何从客户端中断您的方法。整个控件被填充、呈现,然后才发送到客户端。您可能会使用 ajax 中断回调,但控件根本不会返回。

另一种方法是使用 ajax 以块的形式加载内容并将它们附加到客户端的控件中。

【讨论】:

  • 我只举了一个例子,如果加载一个包含大量数据的网格视图,那么用户如何取消呢?我尝试了 ajax 更新面板,它运行良好,它会停止加载,但服务器端功能将在后台运行,我该如何阻止它?
  • 服务器端处理一旦运行就不能停止。不幸的是,这就是 Web 的异步特性。或者至少您必须编写大量基础架构来模拟状态,以至于“取消”请求可以映射到仍在后台某处运行的特定进程。
  • 是的,它是必需的。一些加载功能用户应该可以选择取消,否则即使他不想要,他也必须等待完成加载。这就是我尝试任何可能停止该过程的原因。谢谢你的建议。
【解决方案2】:

没有正式的方法可以满足您的要求,但如果重构代码,您应该能够获得相同的结果。如果不应该为某些用户加载某些内容,请在您的代码中执行该逻辑,然后再将其呈现到页面。

【讨论】:

    【解决方案3】:

    根据您对其他答案的回答...

    您可以考虑对计时器进行多次 my_ddl.items.add() 调用。将涉及多个单独的回发/ajax 调用。例如:

    1) add records for 2 seconds (instead of a fixed number of records at a time)
    2) check for session("continue") = "true"
    3) add more records for 2 more seconds
    4) check session("continue")
    ...
    

    在某些时候,用户单击取消,这会将“false”分配给 session(“continue”)。下次你的循环检查 session("continue") 时,它会发现它是 false 并退出。

    这将为您提供部分加载的数据控件。您可能希望其他代码清除部分更新。

    【讨论】:

    • 但是我怎样才能改变会话继续为假?如果我在取消按钮事件中编写编码,它应该只有在完成加载按钮后才会被触发,因为我能做什么?如何从客户端更改会话值?
    • 嗯,我认为这可以通过脚本管理器和 Web 方法实现,但您不必使用会话——可以是任何在您的页面上具有价值的东西。例如,您可以为您的取消按钮使用 javascript 以使其在您的 dom 中设置一个值(如隐藏字段的文本值等)
    • 我试过你的方法,但我还是有问题,如果我使用存储过程或sql查询,我认为我们不能这样停止,那我能做什么?请给我建议
    【解决方案4】:

    我认为您可以使用会话变量来完成此操作。请原谅我,但我必须提供 C# 中的示例,但我相信您可以大致了解这一点。

       private bool CancelRequested
            {
                get
                {
                    if (Session["CancelRequested"] == null)
                        return false;
                    else
                        return (bool)Session["CancelRequested"];
                }
                set
                {
                    Session["CancelRequested"] = value;
                }
            }
    
            public void LoadDropDown()
            {
                for (int it = 0; it <= 1000000; it++)
                {
                    if (CancelRequested)
                    {
                        CancelRequested = false;
                        break;
                    }                    
                    //Your logic here
                }
            }
    
            protected void btnCancelRequest_Click(object sender, EventArgs e)
            {
                CancelRequested = true;
            }
    

    这里的想法是初始循环检查 Session 变量以查看它是否应该继续或退出循环。如果页面上有一个按钮,允许用户将此 Session 变量设置为“true”,他们就可以与初始请求进行通信并使其跳出循环。我不确定这是否会完全实现您想要实现的目标,但希望它会有所帮助。

    【讨论】:

      猜你喜欢
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 2023-03-13
      相关资源
      最近更新 更多