如何在ScriptManager中更改已注册脚本的顺序

Ric*_*ard 8 .net c# asp.net master-pages

背景

在我们的母版页中,我们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>
Run Code Online (Sandbox Code Playgroud)

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

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

预期

  1. master.js
  2. jQuery的min.js
  3. jquery-ui.js*

实际

  1. jquery-ui.js*
  2. master.js
  3. jQuery的min.js

有没有办法更改已加载已注册脚本的顺序?

- 要么 -

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

And*_*rei 5

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

  • 添加到管理器的脚本在页面上逐个注册,以便它们出现在集合中ScriptManager.Scripts(如果您很好奇 - 通过方法ClientScript.RegisterClientScriptBlock,而不是Render方法或smth那样).

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

因此一种方式

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

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

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);
}
Run Code Online (Sandbox Code Playgroud)

一个小注 - 在代码示例中可以看到,我会建议ScriptManager在页面上没有时处理大小写.