AutoPostBack на элементе управления CheckBox иногда дает сбой - PullRequest
0 голосов
/ 11 ноября 2010

Если есть разметка ниже.

<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 ]

1 голос
/ 11 ноября 2010

Я не понимаю, почему не следует отправлять обратно, когда вы check/uncheck checkbox, но если единственная цель этого флажка - hide/unhide панель, я бы предпочел сделать это в JavaScript. Выполнение полной обратной передачи на сервер только для того, чтобы скрыть какую-то панель, кажется очень плохим.

В javascript вы можете сделать это, чтобы скрыть панель:

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

И это, чтобы показать это:

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

Это будет намного быстрее и лучше. Просто установите обычный флажок вместо ASP.NET и подпишитесь на событие onclick.


Извините, еще один комментарий:

Я думаю, что вы не правы, когда говорите, что флажок ВСЕГДА должен вызывать обратную передачу. Нет, если один из валидаторов срабатывает внутри панели, флажок не будет вызывать обратную передачу, пока условие не будет выполнено.

0 голосов
/ 24 января 2012

Это то, что я сделал, и это сработало. при включении события onclick я отключил все элементы управления validation и сразу же сделал Page_ClientValidate();, и это сработало.

...