1

IScriptControlインターフェイスを使用してカスタムコントロールを実装するときに、スクリプトをページにレンダリングする順序を指定するにはどうすればよいですか?それはjQueryのスクリプト参照をレンダリングする前に、jQueryUIスクリプト参照をレンダリングするためのコードは、上記の問題を作成し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[] { }; 
    } 
} 

は、ここで私がやっているものの例です。私は順序を変更する場合は、スクリプトが正しい順序でレンダリング:

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

また、あなたはあなたのリソースとして含まれるの埋込みやDLLとしてあなたのコントロールをコンパイル検討すべきです。これにより、サーバーはリソースハンドラashxを使用できるようになり、リソースハンドラによって管理される1つのダウンロードにスクリプトを組み合わせることができます。 –

関連する問題