8

背景

在我们的母版页中,我们有一个ScriptManager看起来像这样的

<asp:ScriptManager ID="ScriptManager" runat="server" EnablePartialRendering="False" EnableScriptLocalization="true">
    <Scripts>
        <asp:ScriptReference Path="~/js/master.js" />
        <asp:ScriptReference Path="~/js/jquery-min.js" />
    </Scripts>
</asp:ScriptManager>

我正在通过执行以下操作在页面上的嵌套控件中注册其他脚本

protected override void OnPreRender(EventArgs e)
{
    ScriptManager.RegisterClientScriptInclude(this, this.GetType(), "jquery-ui", "~/js/jquery-ui.js");
    base.OnPreRender(e);
}

预期的

  1. 大师.js
  2. jquery-min.js
  3. jQuery-ui.js *

实际的

  1. jQuery-ui.js *
  2. 大师.js
  3. jquery-min.js

问题

有什么办法可以改变注册脚本的加载顺序吗?

- 或者 -

是否可以至少确保在实际ScriptManager块中注册的脚本在代码隐藏注册脚本之前注册?

4

2 回答 2

5

在深入研究ScriptManager源代码之后,我们可以做出两个有用的观察:

  • 添加到管理器的脚本会按照它们出现在集合中的顺序一一注册在页面上ScriptManager.Scripts(如果您好奇 - 通过方法ClientScript.RegisterClientScriptBlock,而不是在Render方法或类似的东西中)。

  • 标记中声明的脚本将ScriptManager.ScriptsScriptManager对象创建时添加到集合中。

因此,一种方法

确保在实际 ScriptManager 块中注册的脚本在代码隐藏注册脚本之前注册

是将控件中的脚本直接添加到ScriptManager.Scripts集合中,而不是使用ScriptManager类的静态实用程序方法。控件的代码示例如下:

protected override void OnPreRender(EventArgs e)
{
    ScriptManager currentScriptManager = ScriptManager.GetCurrent(this.Page);
    if (currentScriptManager != null)
    {
        ScriptReference scriptRef = new ScriptReference("~/js/jquery-ui.js");
        currentScriptManager.Scripts.Add(scriptRef);
    }
    else
    {
        this.Page.ClientScript.RegisterClientScriptInclude(
            this.GetType(), "jquery-ui", "js/jquery-ui.js");
    }

    base.OnPreRender(e);
}

一个小注释 - 正如代码示例中所见,我建议ScriptManager在页面上没有的情况下处理案例。

于 2012-06-21T09:22:40.870 回答
1

在您的页面中,使用<asp:ScriptManagerProxy>注册您的脚本,它们将按预期顺序出现。在代码隐藏中注册的脚本在 ASPX 被解析之前被添加到脚本管理器中。

于 2015-03-09T14:36:18.160 回答