背景
在我们的母版页中,我们有一个看起来像这样的 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);
}
预计
- master.js
- jquery-min.js
- jquery-ui.js *
实际
- jquery-ui.js *
- master.js
- 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/