【问题标题】:How do I perform a partial post back after the page loads on the client?页面加载到客户端后,如何执行部分回发?
【发布时间】:2011-05-13 21:34:08
【问题描述】:

第一次在服务器上加载页面时,我有一些处理可能需要 5 秒以上。这是一个超出我控制范围的外部约束,因为它发生在一个 WebPart 中,可以添加到我无法控制的服务器上的任何页面中,所以我无法在更大的范围内(例如应用程序)进行此处理。

我希望页面在更新面板中发生部分回发时显示进度,而不是用户在看到任何内容之前等待页面加载。该回发背后的代码将完成繁重的工作。

我尝试过使用 ajax 计时器,该计时器运行良好,除非在回发后的代码中引发异常。

总之,我想知道如何在页面加载到客户端后立即执行一次部分回发。

【问题讨论】:

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


    【解决方案1】:

    我想通了。要通过 UpdatePanel 部分回发到服务器而不使用隐藏控件,请使用 jQuery 执行此操作:

    <script type="text/javascript">
        $(document).ready(function () {
            __doPostBack('<%=UpdatePanel1.ClientID %>');
        });
    </script>
    

    一旦 HTML DOM 准备好,这将针对 ID 为 UpdatePanel1 的 UpdatePanel 执行部分回发到服务器。然后,您可以使用 ASP.NET 页面生命周期来挂钩任何适合您的事件。我勾上了更新面板的加载事件:

    protected void UpdatePanel1_Load(object sender, EventArgs e)
    {
        if (Page.IsPostBack && Session["InitializedKey"] == null)
        {
            Session["InitializedKey"] = true;
            // do your initialization stuff here
        }
    }
    

    上面的代码只有在页面被回发并且会话变量被设置时才会运行。现在您必须在用户刷新页面时清除会话变量,因为这里的目的是在第一次回发时运行此代码,并且只在第一次回发时运行。所以清除Page_Load中的session变量:

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
            Session[initializedKey] = null;
    }
    

    如果您想在页面处于部分回发状态时显示进度指示器,请执行以下 javascript:

    <script type="text/javascript">
        var prm = Sys.WebForms.PageRequestManager.getInstance();
        prm.add_beginRequest(BeginRequestHandler);
        prm.add_endRequest(EndRequestHandler);
        function BeginRequestHandler(sender, args) {
            if (args._postBackElement.id == '<%=UpdatePanel1.ClientID %>') {
                $get('Progress').className = 'Progress';
            }
        }
        function EndRequestHandler(sender, args) {
            if (sender._postBackSettings.sourceElement.id == '<%=UpdatePanel1.ClientID %>') {
                $get('Progress').className = 'Hidden';
            }
        }
    </script>
    

    这需要一个带有 id 'Progress' 的 div 标签,以及你想在该 div 中显示的任何内容。您还需要一些 css 来在名为 Hidden 和 Progress 的类中的 div 标签上设置显示和可见样式。不要忘记对部分回发执行错误处理!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 2012-02-18
      • 1970-01-01
      • 2013-01-13
      • 1970-01-01
      相关资源
      最近更新 更多