CheckBox控件上的AutoPostBack有时会失败

时间:2010-11-11 14:25:00

标签: asp.net checkbox postback autopostback

如果有以下标记。

<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#编写的,但我没有发布任何实际代码,因为与此标记相关的所有用户代码似乎都能正常工作。

问题是CheckBox chkTVLic导致验证设置为false并且autopostback设置为true。因此,当我选中并取消选中复选框时,无论发生什么,它都应该回发。大部分时间这正是它的作用,结果是在检查和取消选中时显示和隐藏pnlTVLic。但是,如果面板中的验证器触发,则该复选框不会在第一次引发回发。它将在随后的所有时间,但从来没有第一次。但是它应该总是导致回发。有什么可以阻止它。在有人要求没有使用编写的客户端代码之前,一切都是纯粹的.net标记和c#代码。

2 个答案:

答案 0 :(得分:1)

我不明白为什么在check/uncheck checkbox时不应该回发,但如果该复选框的唯一目的是hide/unhide某个小组,我宁愿做它在javascript中。为了隐藏某些面板而对服务器进行完整回发似乎非常糟糕。

在javascript中,您可以执行此操作来隐藏面板:

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

这就是为了表明:

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

它会变得更快更好。只需放置一个常规复选框而不是ASP.NET,然后订阅onclick事件。


对不起,还有一条评论:

当你说复选框应该总是导致回发时,我认为你错了。不,如果其中一个验证器在面板内部触发,则复选框将不会导致回发,直到满足条件。

答案 1 :(得分:0)

这就是我所做的并且有效。 在复选框onclick事件上我禁用了所有validation控件并立即执行了Page_ClientValidate();并且它有效。