在动态添加的服务器控件上注册 javascript 资源

Register javascript resource on a dynamically added server control

我创建了一个 ASP.Net 服务器控件,我们称它为 "WebGrid"。 WebGrid 控件有一个嵌入的 javascript 资源,它向托管它的任何页面的 ScriptManager 注册。

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);

        ClientScriptManager scriptManager = this.Page.ClientScript;
        scriptManager.RegisterClientScriptResource(typeof(WebGrid), "Atl.Core.Resources.Scripts.WebGrid.js");
    }

我还通过将文件的构建操作 属性 更改为 "Embedded Resource" 并将资源添加到 [=28] 来确保 WebGrid.js 文件是嵌入式资源=] 项目本身:

[assembly: WebResource("Atl.Core.Resources.Scripts.WebGrid.js", "text/js")]

现在,当在 aspx 页面的标记中声明控件时,javascript 资源已在 ScriptManager 中注册,一切正常。但是,如果我通过单击按钮动态地将控件添加到页面的 ControlCollection 中,javascript 不会注册并且控件抱怨找不到这样那样的 javascript 函数。请注意,按钮和 WebGrid 都位于 different UpdatePanels...

编辑:看起来问题是因为我使用的是 ClientScript 与 ScriptManager 参见 (Differences between ScriptManager and ClientScript when used to execute JS?)。那么,我该如何将 WebGrid 的脚本注册到页面的 ScriptManager?

所以我想通了。答案很简单。在控件 PreRender 事件处理程序中,只需调用 ScriptManager class 上的静态 RegisterClientScriptResource 方法。我很困惑,因为我认为我需要在页面上引用物理 ScriptManager!没有。您仍然需要将脚本设置为嵌入资源,并在 Assembly.cs 文件中添加 WebResource 属性。

    protected override void OnPreRender(EventArgs e)
    {
        base.OnPreRender(e);

        ScriptManager.RegisterClientScriptResource(this, typeof(ScriptTest), "Atl.Core.Resources.Scripts.ScriptTest.js");
    }