如何在使用IScriptControl接口實現自定義控件時決定腳本呈現給頁面的順序?如何在執行IScriptControl.GetScriptReferences時規定腳本呈現給頁面的順序?
下面是我在做什麼的例子:
public class MyScriptControl : WebControl, IScriptControl
{
private static ConcurrentBag<ScriptReference> ScriptReferences;
static MyScriptControl()
{
ScriptReferences = new ConcurrentBag<ScriptReference>
{
new ScriptReference { Name = "jquery" },
new ScriptReference { Name = "jquery-ui" },
new ScriptReference { Name = "myscriptcontrol" }
};
ScriptManager.ScriptResourceMapping.AddDefinition("myscriptcontrol",
new ScriptResourceDefinition
{
ResourceAssembly = Assembly.GetCallingAssembly(),
ResourceName = "Path.To.Scripts.myscriptcontrol.js"
}
);
}
public MyScriptControl()
{ }
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
ScriptManager.GetCurrent(Page)
.RegisterScriptControl<MyScriptControl>(this);
}
protected override void Render(HtmlTextWriter writer)
{
// Render UI
}
public IEnumerable<ScriptReference> GetScriptReferences()
{
foreach (var reference in ScriptReferences)
{
yield return reference;
}
}
public IEnumerable<ScriptDescriptor> GetScriptDescriptors()
{
return new ScriptDescriptor[] { };
}
}
,因爲它呈現渲染jQuery腳本引用之前jQueryUI的腳本參考上面的代碼創建了一個問題。如果我更改順序,腳本渲染正確的順序:
ScriptReferences = new ConcurrentBag<ScriptReference>
{
new ScriptReference { Name = "myscriptcontrol" },
new ScriptReference { Name = "jquery-ui" },
new ScriptReference { Name = "jquery" }
};
這是偉大的一個單一的控制,但我正在開發數十種內部控制,其中一些將會對jQuery的或其他庫的依賴關係,並且我想確保無論呈現給頁面的控件的組合是多少,都將以正確的順序呈現腳本引用以避免任何依賴性問題。
除了搞清楚如何規定依賴腳本的順序之外,還可以隨意拆開你在這裏看到的任何不良行爲或問題代碼。
此外,你應該考慮你的embeding包括資源和編譯您的控件作爲一個DLL。這將允許服務器使用資源處理程序ashx,並且可以將腳本組合成一個由資源處理程序管理的下載文件。 –