部分刷新期间启动脚本不会触发

时间:2009-12-03 02:48:47

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

我有一个名为MyUpdateControl的用户控件,用于触发启动脚本 - 它的HTML只是:

<div id="updatableArea"></div>

启动脚本添加在用户控件的OnLoad()中:

string doUpdateScript = String.Format(
    "DoUpdate('{0}')",
    someValue);
this.Parent.Page.ClientScript.RegisterStartupScript(typeof(Page), "DoUpdateScript", doUpdateScript);

MyUpdateControl用户控件有时包含在另一个用户控件的更新面板中:

<asp:UpdatePanel ID="myUpdatePanel" runat="server" >  
    <ContentTemplate>
        <UC1:MyUpdateControl ID="myUpdaterControl" runat="server" />
    </ContentTemplate>
</asp:UpdatePanel>

在这些情况下,只有在首次加载页面时才会触发脚本。它永远不会在异步回发期间触发。如何确保在异步回发期间也调用它?

1 个答案:

答案 0 :(得分:1)

UpdatePanel而非ClientScript.RegisterStartupScript内注册脚本时,您需要使用ScriptManager.RegisterStartupScript。此方法存在重载,需要将注册客户端脚本块的控件作为其第一个参数。

public class MyUpdateControl  : Control
{
    public MyUpdateControl()
    {         
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        //..
        string doUpdateScript = String.Format(
            "DoUpdate('{0}')", someValue);
        ScriptManager.RegisterStartupScript(this, GetType(),
             "ServerControlScript", script, true);
        //..
    }
}

上面的示例使用自定义控件,我意识到您正在使用用户控件。这两个实现非常相似,但为了完整性,我在下面列举了一个例子。

public partial class MyUpdateControl : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {       
        //..
        string doUpdateScript = String.Format(
            "DoUpdate('{0}')", someValue);
        ScriptManager.RegisterStartupScript(this, GetType(),
             "ServerControlScript", script, true);
        //..
    }
}