异步回传不会导致document.ready被执行

9
我需要对一些用户控件进行更改,这些控件用于几个页面。该用户控件包含一些JQuery来处理分页任务(显示3个月的数据并每次隐藏9个)。当控件加载时,它将自动显示当前季度并在$(document).ready()中执行此代码。
我的问题是,在其中一个页面中使用用户控件时,该控件在页面加载时不可见。使用异步PostBack更改可见性,但这不会执行ready()。
我找到了一段代码片段,允许托管页面拦截部分PostBack的EndResponse,但我仍然无法执行用户控件内的函数。
有人有什么建议吗?
谢谢
Dave

是的,主页面包含多个更新面板——包含此用户控件的面板还包含其他4或5个。 - Dave
4
请参见 https://dev59.com/C3M_5IYBdhLWcg3w9oQA#1153002。 - Russ Cam
1个回答

11

就像我做的一样,你可能会讨厌微软的官方答案。"官方"答案是使用PageRequestManager来设置请求处理程序。这个请求处理程序会在每次部分后续请求完成后被执行。

请求处理程序示例:

<script id="events" type="text/javascript">

    jQuery(document).ready(function() {

        // Your normal code goes here
        setupSomething();
        initializeSomethingElse();

        // Setup your partial-postback event handler.
        // This is used to rewire all events since all are 'lost' after partial-postback.
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(requestHandler);
    });

    ///<summary>partial postback event handler. Executed after the partial postback is completed. Clears modal popup textboxes</summary>
    ///<param name="sender"></param>
    ///<param name="args">http://www.asp.net/ajax/documentation/live/ClientReference/Sys.WebForms/EndRequestEventArgsClass/default.aspx</param>
    function requestHandler(sender, args) {

        if (args.get_error() == undefined) {

            // Your normal code goes here
            setupSomething();
            initializeSomethingElse();
        }
        else
            alert(args.get_error()); // Do something
    }
</script>

这就是简单的答案:
为什么不在代码后台明确初始化您的用户控件,并将该初始化JavaScript保存在用户控件的HTML中。

void YourUserControl_PreRender(object sender, EventArgs e)
{
    try
    {

    }
    catch (Exception ex)
    {

    }
    finally 
    {
        // Do this
        ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "registerInitializer", buildInitializer(), true);
    }
}

一旦渲染完成,“buildInitializer”逻辑将会判断:“如果该函数在客户端上存在...就调用它。” 然后......每次都有效。

private string buildInitializer()
{
    StringBuilder javascript = new StringBuilder();

    javascript.Append("if (window.initializeMyControl) {");
    javascript.Append("if(typeof window.initializeMyControl == 'function') { initializeMyControl(); }");
    javascript.Append("}");

    return javascript.ToString();
}

现在你的用户控件初始化可以存在于应该存在的地方:用户控件中:

<script type="text/javascript">
    function initializeMyControl() {

        // Your normal code goes here
        setupSomething();
        initializeSomethingElse();
    }
</script>

非常有帮助的答案,谢谢。在我实施您的解决方案后,我看到了问题中流行的评论,并使用更少的代码解决了我的问题:https://dev59.com/C3M_5IYBdhLWcg3w9oQA#1153002 - daniloquio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接