1

如何在使用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的或其他庫的依賴關係,並且我想確保無論呈現給頁面的控件的組合是多少,都將以正確的順序呈現腳本引用以避免任何依賴性問題。

除了搞清楚如何規定依賴腳本的順序之外,還可以隨意拆開你在這裏看到的任何不良行爲或問題代碼。

回答

0

它不一定是聲明腳本的順序,以確定順序。如果有許多腳本和許多DocumentReady函數,由於Jquery循環並處理每個DocumentReady功能塊,如果文檔尚未準備好,它會將該函數推入等待堆棧。如果文檔準備就緒,它立即處理該功能。因此,DocReady呼叫您的第一個包含將始終執行最後一個,並且最後一個可能會首先執行,因爲在文檔最終準備就緒時會在最後處理它。

這篇文章解釋得很好,並提出一種解決方法是:

Change Execution Order of DocumentReady

+0

此外,你應該考慮你的embeding包括資源和編譯您的控件作爲一個DLL。這將允許服務器使用資源處理程序ashx,並且可以將腳本組合成一個由資源處理程序管理的下載文件。 –