【问题标题】:How to stop update panel current process and call button click event如何停止更新面板当前进程并调用按钮单击事件
【发布时间】:2014-01-15 19:40:50
【问题描述】:

在我的 ASP.NET 页面中,我的用户可以在发送任何付款之前检查客户余额。余额更新标签位于更新面板内,有时检查客户余额需要比平时更长的时间,因此用户可能只想取消检查并继续下一步。

有没有办法停止当前的更新面板事件(当它正在运行并且花费太长时间时)并使用 JavaScript 调用一些按钮的 Click 事件?

【问题讨论】:

  • 其实我的目标是在 UpdatePanel 运行时取消它的 PostBack,或者如果它花费的时间太长。
  • 链接不就是这么解释的吗?
  • 它禁用更新面板加载图像,但页面一直等待直到第一个请求完成。

标签: javascript asp.net


【解决方案1】:

您可以使用代码like this取消UpdatePanel的刷新。

var divElem = 'AlertDiv';
var messageElem = 'AlertMessage';

Sys.Application.add_load(ApplicationLoadHandler)
function ApplicationLoadHandler(sender, args)
{
     Sys.WebForms.PageRequestManager.getInstance().add_initializeRequest(CheckStatus);
}
function CheckStatus(sender, args)
{
  var prm = Sys.WebForms.PageRequestManager.getInstance();
  if (prm.get_isInAsyncPostBack() & args.get_postBackElement().id == 'CancelRefresh') {
     prm.abortPostBack();
  }
  else if (prm.get_isInAsyncPostBack() & args.get_postBackElement().id == 'RefreshButton') {
     args.set_cancel(true);
     ActivateAlertDiv('visible', 'Still working on previous request.');
 }
  else if (!prm.get_isInAsyncPostBack() & args.get_postBackElement().id == 'RefreshButton') {
     ActivateAlertDiv('visible', 'Retrieving headlines.');
  }
}
function ActivateAlertDiv(visString, msg)
{
     var adiv = $get(divElem);
     var aspan = $get(messageElem);
     adiv.style.visibility = visString;
     aspan.innerHTML = msg;
}
if(typeof(Sys) !== "undefined") Sys.Application.notifyScriptLoaded();

但是,ASP.NET 请求的处理将在后台继续。

如果用户在完成之前无法导航,则可能是 ASP.NET 会话锁定导致您的第二个请求无法启动,直到第一个请求完成。您可以尝试检查第一个请求代码中的Response.IsClientConnected 属性,如果false 则中止它。如果您的主线程正忙于处理,您可能需要在单独的线程中检查这一点,但这取决于您的应用程序的体系结构。

一个更简单的建议是尝试禁用会话,或者将其设置为仅在您的页面不使用或写入时才读取(引用自this answer):

如果您的页面没有修改任何会话变量,您可以选择退出大部分锁定。

<% @Page EnableSessionState="ReadOnly" %>

如果您的页面没有读取任何会话变量,您可以为该页面选择完全退出此锁定。

<% @Page EnableSessionState="False" %>

如果您的页面都没有使用会话变量,只需在web.config 中关闭会话状态

<sessionState mode="Off" />

【讨论】:

    【解决方案2】:

    我在 C# 中找到了解决方案。此代码放在更新 UpdatePanel 控件的代码中:

            Thread th = new Thread(DoSomething);
            th.Start();
            if (!th.Join(TimeSpan.FromSeconds(3)))
            {
                th.Abort();
            }
    

    如果 UpdatePanel 的更新时间超过 3 秒,那么它只会中止当前线程。

    【讨论】:

    • 这是否回答了您的实际问题“使用 JavaScript 调用 [a] 按钮单击事件”?另外,它从 AJAX 请求返回给浏览器的 HTTP 响应是什么,是否会导致脚本错误?
    • 是的,确实如此!为了从 JavaScript 调用按钮单击事件,您可以使用:document.getElementById('ctl00_MainContent_btnSubmit').click();
    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 2011-08-19
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多