2016-10-26 25 views
0

私はselect2.jsマルチセレクトを持っています。このマルチ選択で選択した値は、ポストバック後に他のコントロールを作成します。 Select2.jsはポストバックを通じてその内容を保持するように設計ので、私はそれを動作させるためにはJQueryのビットを追加していない:これは、ポストバックを通じて.select2の値を保持するために正常に動作ページライフサイクル - Page_Init()にコントロールに値がありません。Page_load()が遅すぎます

    <select id="selectParameters" multiple="true" runat="server" clientidmode ="Static" style="width:100%;" class="textBox;"> 
        </select> 
        <asp:hiddenField ID="hdnParameters" runat="server" ClientIDMode="Static" /> 

     <script type="text/javascript"> 

     $(document).ready(function() { 
        $("#selectParameters").select2({ 
         placeholder: "Select parameter(s)" 
        }); 

        if ($("#hdnParameters").val != "") { 
         // This is not a postback - Move all currently selected items into the hidden selection 
         $("#hdnParameters").val($("#selectParameters").val()); 
        } else { 
         // This is a postback - Use the hidden selection to populate the currently selected items 
         $("#selectParameters").select2("val", $("#hdnParameters").val()); 
        } 

        $("#selectParameters").on("select2:select", function (e) { 
         // Selection was updated - Move all currently selected items into the hidden selection 
         $("#hdnParameters").val($("#selectParameters").val()); 
        }); 

        $("#selectParameters").on("select2:unselect", function (e) { 
         // Selection was updated - Move all currently selected items into the hidden selection 
         $("#hdnParameters").val($("#selectParameters").val()); 
        }); 

        $("#btnAllParameters").click(function(){ 
         // Select all 
         $("#selectParameters > option").prop("selected", "selected"); 
         $("#selectParameters").trigger("change"); 
         $("#hdnParameters").val($("#selectParameters").val()); 
         return false; 
        }); 

        $("#btnNoParameters").click(function() { 
         // De-select all 
         $("#selectParameters > option").prop("selected", ""); 
         $("#selectParameters").trigger("change"); 
         $("#hdnParameters").val($("#selectParameters").val()); 
         return false; 
        }); 



       }); 

      </script> 

、およびselect2はpage_load中に適切に再生成されます。

他のコードでは、findControl()を使用して、動的に作成されたコントロール(select2コントロールの内容に基づいて作成されたコントロール)に含まれる値にアクセスしています。 findControl()を使用するには、page_init中にコントロールを生成する必要があります。

Private Sub page_init() Handles Me.Init 
    If IsPostBack Then 
     Dim parameterSelection = hdnParameters.Value 
     ' Add some controls to the page based upon the contents of parameterSelection 
    End If 
End Sub 

上記のコードでは、page_initでこのコードを実行するとparameterSelection = ""です。

私がPage_Loadの中に、同一のコードを実行すると、パラメーター選択は、私が期待した値を取得し、(それらがpage_init中に作成されていなかったので、私は、動的に作成されたコントロール上にFindControl()を使用することはできませんを除き)すべてがうまく動作します

私は、ポストバック後に動的に作成されたコントロールに含まれる値にアクセスできるようなソリューションを探しています。彼らはpage_init中に作成されていなかったとして

  • 現在、私は、しかし、動的に作成されたコントロールがにFindControl()を介してアクセスできなくなり、Page_Loadの中にSELECT2をロード
  • 私はに基づいて動的にコントロールを作成することはできません。 hidden_​​fieldとselect2の値がその時点で値を持っていないように、page_init中のselect2の値
+0

いいえ、サーバー側は常に最初に実行されます。選択肢を ''に格納することをお勧めします。そうすれば、javascriptを待つことなくコードビハインドで選択した要素を取得/使用できます。 – Santi

+0

ちょうど試みました、hdnParametersはpage_initの間に値を持っていません。 –

+0

'runat =" server "'を持つ ''ですか?ポストバック時にその値を保持するASP.Netコントロールなので、私は非表示フィールドを提案しました。 page_init hdnParameters.value =時:<のHiddenField ID = "hdnParameters" にrunat = "サーバー" のClientIDMode = "静的"/ASP> ' "" 私の知る限り、私を見ることができるよう : – Santi

答えて

0

これを取得しました! page_init中に隠しフィールドの値を取得するには、私が使用:何らかの理由で

parameterSelection = Request.Form("ctl00$contentPlaceholder$hdnParameters").ToString.Split(",").ToList 

、フォームからそれを要求するときに、コントロールが非静的な識別子を持っているのClientIDMode =「静的」を使用しているにもかかわらず(静的識別子があります後でページのライフサイクルで割り当てられますか?)

これはうまくいきました。デバッグモードでRequest.Formをブラウズしている間、適切な識別子が見つかりました。

ご意見ありがとうSanti

関連する問題