页面生命周期 - 控制在Page_Init()上没有任何价值,Page_load()为时已晚

时间:2016-10-26 20:39:14

标签: jquery asp.net vb.net select2

我有一个select2.js多选。此多选中的选定值将导致在回发后创建其他控件。 Select2.js不是为了通过回发保留其内容而设计的,所以我添加了一些JQuery来使其工作:

                    <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期间正确地重新填充select2。

在代码的其他地方,我使用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期间运行此代码,则参数为“”。

如果我在page_load期间运行相同的代码,则parameterSelection获取我期望的值并且一切运行正常(除非我不能在动态创建的控件上使用FindControl(),因为它们不是在page_init期间创建的)

我正在寻找一种解决方案,以便在回发后可以访问动态创建的控件中包含的值。

  • 目前我在page_load期间加载了select2,但是动态创建的控件无法通过FindControl()访问,因为它们不是在page_init期间创建的
  • 我无法在page_init期间根据select2的值创建动态控件,因为hiddenfield和select2当时似乎没有值

1 个答案:

答案 0 :(得分:0)

知道了!要在page_init期间检索隐藏字段的值,我使用了:

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

出于某种原因,尽管使用了clientIDMode =&#34; Static&#34;,但是当从表单请求时,控件具有非静态标识符(稍后是否在页面生命周期中分配静态标识符?)

这样做了 - 在调试模式下浏览Request.Form时找到了正确的标识符。

感谢您的建议Santi