c# - 如何更改 ScriptManager 中已注册脚本的顺序

标签 c# asp.net .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>

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

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

预计

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

实际

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

问题

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

- 或 -

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

最佳答案

深入研究 ScriptManager 源代码后,我们可以得出两个有用的结论:

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

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

因此有一种方法可以

ensure the scripts that are registered in the actual ScriptManager block are registered prior to code-behind registered scripts

是将控件中的脚本直接添加到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 时处理大小写。

关于c# - 如何更改 ScriptManager 中已注册脚本的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11121251/

相关文章:

c# - MD5 computeHash(Stream) 和 computeHash(byte[]) 有什么区别

c# - 对于 Windows Phone 7, "assembly"是什么?

asp.net - 发布应用程序无法找到存在的文件

c# - 需要实现推送通知将消息推送到桌面客户端(不是网络/浏览器)

.net - 需要鼠标滚轮滚动用户控件

c# - 为什么StreamWriter在Windows Service中不能工作?

c# - 检测PDF文件是否正确(标题PDF)

c# - 使用 Reactive Extensions 制作 Action<T> 的通用调度程序

c# - 为什么英语(加勒比海)的文化名称是 "en-029"?

c# - 选择用户控件时如何禁用 ASP.NET 页面中的控件?