代码之家  ›  专栏  ›  技术社区  ›  Coding Flow

复选框控件上的autopostback有时失败

  •  0
  • Coding Flow  · 技术社区  · 15 年前

    如果有下面的标记。

    <asp:checkbox id="chkTVLic" runat="server" text="TV Licence" oncheckedchanged="chkDocs_CheckChanged"
                                    autopostback="true" CausesValidation="false" />
                                <asp:panel id="pnlTVLic" runat="server" visible="false">
                                    <div class="toggle-item-link1 document-date">
                                        <asp:panel id="pnlTVLicIssueDate" runat="server">
                                            <p>
                                                Please enter the date of issue
                                            </p>
                                            <div class="fm-req">
                                                <asp:textbox id="txtTVLicIssueDate" cssclass="tb size2" runat="server" onblur="return true;"></asp:textbox>
                                                <cc2:calendarextender id="caleTVLicIssueDate" runat="server" targetcontrolid="txtTVLicIssueDate"
                                                    popupbuttonid="ibnTVLicIssueDate" popupposition="BottomLeft" animated="true"
                                                    format="dd/MM/yyyy">
                                                </cc2:calendarextender>
                                                <asp:imagebutton id="ibnTVLicIssueDate" runat="server" imageurl="../images/img-calendar-day.png"
                                                    alternatetext="Calendar" tooltip="Pick Date" cssclass="date-picker" />
                                                <asp:requiredfieldvalidator id="rfvTVLicIssueDate" CssClass="error" runat="server" controltovalidate="txtTVLicIssueDate"
                                                    display="Dynamic" errormessage="Required" setfocusonerror="true" validationgroup="TVLic"></asp:requiredfieldvalidator>
                                                <asp:comparevalidator id="cmvTVLicIssueDate" CssClass="error" runat="server" errormessage="Not a valid date"
                                                    controltovalidate="txtTVLicIssueDate" operator="DataTypeCheck" type="Date" setfocusonerror="true"
                                                    validationgroup="TVLic" display="Dynamic" cultureinvariantvalues="true"></asp:comparevalidator>
                                                <asp:customvalidator id="cuvTVLicIssueDate12Months" CssClass="error" runat="server" controltovalidate="txtTVLicIssueDate"
                                                    validationgroup="TVLic" display="Dynamic" onservervalidate="cuvDocIssueDate12Months_ServerValidate"
                                                    errormessage="Document must be less than 12 months old."></asp:customvalidator>
                                            </div>
                                        </asp:panel>
                                        <asp:panel id="pnlTVLicApprove" runat="server">
                                            <asp:LinkButton id="lbnTVLicApprove" runat="server" CssClass="screen-hide"
                                                    alternatetext="Confirm TV Licence" tooltip="Confirm TV Licence" Text="OK" CausesValidation="false" OnClick="lbnApproveConfirm_Click"  />
    
                                            <asp:imagebutton id="ibnTVLicApprove" runat="server" imageurl="../images/img-accept-doc-off.png"
                                                alternatetext="Approve" tooltip="Approve" cssclass="approval-btn" causesvalidation="true" validationgroup="TVLic" OnMouseDown="HandleApproveClick('TVLic','lbnTVLicApprove');return false;" OnClientClick="HandleApproveClick('TVLic','lbnTVLicApprove');return false;" />
                                            <span class="approval-label">Accept document:</span></asp:panel>
                                    </div>
                                </asp:panel>
    

    这个应用程序是用c编写的,但是我没有发布任何实际的代码,因为所有与这个标记相关的用户代码似乎都工作正常。

    问题是chktvlic has复选框导致验证设置为false,而autopostback设置为true。所以无论发生什么,当我选中并取消选中复选框时,它都应该回发。大多数情况下,这正是它所做的,当选中和取消选中时,结果是显示和隐藏pnltvlic。但是,如果面板内的验证器上有任何内容触发,则复选框不会第一次导致回发。它将在以后的所有时间,但从来没有第一次。但是它应该总是引起回发。是什么阻止了它。在有人问到编写客户端代码毫无用处之前,一切都是纯.NET标记和C代码。

    2 回复  |  直到 15 年前
        1
  •  1
  •   Suraj Shrestha user3854793    11 年前

    我不明白为什么当你 check/uncheck 这个 checkbox ,但如果该复选框的唯一目的是 hide/unhide 作为一个面板,我宁愿用javascript来实现。仅仅为了隐藏某个面板而对服务器进行完整的回发似乎非常糟糕。

    在javascript中,您可以这样做来隐藏面板:

    document.getElementById('<%=pnlTVLic.ClientID%>').display='none';
    

    为了证明这一点:

    document.getElementById('<%=pnlTVLic.ClientID%>').display='block';
    

    会更快更好。只需放置一个常规的复选框而不是asp.net复选框,然后订阅onclick事件。


    抱歉,还有一条评论:

    我认为你说复选框应该总是引起回发是错误的。不,如果其中一个验证器在面板内部触发,则复选框在满足条件之前不会导致回发。

        2
  •  0
  •   amesh Vaibhav.Inspired    13 年前

    这就是我所做的,而且成功了。 on checkbox onclick event我禁用了所有 validation 控制并立即 Page_ClientValidate(); 而且成功了。