【问题标题】:Page Life Cycle - Control has no value on Page_Init(), Page_load() is too late页面生命周期 - 控件对 Page_Init() 没有价值,Page_load() 为时已晚
【发布时间】:2016-10-26 20:39:14
【问题描述】:

我有一个 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 期间运行此代码,parameterSelection = ""。

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

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

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

【问题讨论】:

  • 不,服务器端总是先执行。我建议将选择存储在 &lt;asp:Hiddenfield&gt; 中,这样您就可以在代码隐藏中获取/使用选定的元素,而无需等待 javascript。
  • 刚试过,hdnParameters在page_init期间没有值。
  • &lt;asp:Hiddenfield&gt;runat="server" 吗?我建议使用隐藏字段,因为它是一个 ASP.Net 控件,在回发期间保留其值。
  • 是的,这是声明:&lt;asp:hiddenField ID="hdnParameters" runat="server" ClientIDMode="Static" /&gt; 在 page_init hdnParameters.value = "" 据我所知,我没有在任何地方重置它的值。
  • 如果hdnParameters是隐藏字段,则需要使用.val,而不是.text

标签: jquery asp.net vb.net select2


【解决方案1】:

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

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

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

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

感谢您的建议桑蒂

【讨论】:

    猜你喜欢
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多