6

私のカスタムサーバー側ajaxコントロールはIScriptControlを実装しています:

  • GetScriptReferences
  • GetScriptDescriptors

最初のメソッドはjavascriptファイルを送信し、2番目のメソッドは送信された以前の.jsファイルに基づいてjavascriptオブジェクトを作成します。

'AssembleyInfo'ファイルで、以下の行を追加し、プロパティエクスプローラーで.jsファイルを'埋め込みリソース'としてマークしました。

    // this allows access to this files
    [assembly: WebResource("ProjectName.file1.js", "text/javascript")]

    [assembly: WebResource("ProjectName.file2.js", "text/javascript")]

IScriptControlの実装は次のとおりです。

            public IEnumerable<ScriptReference>  
                GetScriptReferences()
            {
                yield return new ScriptReference("ProjectName.file1.js", this.GetType().Assembly.FullName);
                yield return new ScriptReference("ProjectName.file2.js", this.GetType().Assembly.FullName);
            }

            public IEnumerable<ScriptDescriptor>
                GetScriptDescriptors()
             {


                ScriptControlDescriptor descriptor = new ScriptControlDescriptor("ProjectName.file1", this.ClientID);
                //adding properties and events (I use "AnotherName" on the safe side to avoid potentional namespace problems           
                ScriptControlDescriptor descriptor2 = new ScriptControlDescriptor  ("AnotherName.file2", this.ClientID);
                //adding properties and events   

                yield return descriptor;
                yield return descriptor2;

            }

これが私の.jsファイルの一部です:

  • 最初のファイル

    Type.registerNamespace("ProjectName");
    
    ProjectName.file1 = function (element) {
    .......
    .......
    }
    ProjectName.file1.registerClass('ProjectName.file1', Sys.UI.Control);
    
    if (typeof (Sys) !== 'undefined')
        Sys.Application.notifyScriptLoaded();
    
  • 2番目のファイル

    Type.registerNamespace("AnotherName");
    
    AnotherName.file2 = function (element) {
    ............
    ............
    }
    AnotherName.file2.registerClass('AnotherName.file2', Sys.UI.Control);
    
    if (typeof (Sys) !== 'undefined')
        Sys.Application.notifyScriptLoaded();
    

最初のオブジェクトのみを作成するのはなぜですか?

    yield return descriptor

私のASPXには、2番目に作成する必要のあるJavaScriptがあります。

上記のステートメントにコメントすると、2番目のステートメントは正常に作成されます。

4

2 に答える 2

3

同じDOM要素に複数のコントロール定義を登録することはできません。スクリプトエラーが発生します。

Sys.InvalidOperationException:コントロールはすでに要素に関連付けられています。

Sys.UI.Behavior次の代わりに、継承するようにスクリプトクラスの一方または両方を変更する必要がありますSys.UI.Control

YourType.registerClass("YourType", Sys.UI.Control);

になります:

YourType.registerClass("YourType", Sys.UI.Behavior);

ScriptControlDescriptorまた、関連するものをScriptBehaviorDescriptor:に置き換える必要があります。

new ScriptControlDescriptor("YourType", ClientID);

になります:

new ScriptBehaviorDescriptor("YourType", ClientID);

スクリプト動作の作成については、MSDNのエクステンダーコントロールウォークスルーを参照してください:http: //msdn.microsoft.com/en-us/library/bb386403%28v=vs.100%29.aspx

于 2012-11-22T15:13:30.410 に答える
0

あなたの問題はあなたが2つのリターンを使うという事実から生じているようです

yield return descriptor;
yield return descriptor2;

最初にリターンを実行し、次にそれを終了します。そのような2つのリターンを持つ関数を使用することはできません。IEnumerableコレクションを作成し、記述子を中に入れてから、すべてを返します。

List<ScriptDescriptor> descList = new List<ScriptDescriptor>();
descList.add(descriptor);
descList.add(descriptor2);
return descList;
于 2012-11-22T14:51:09.473 に答える