2010-11-11 37 views
0

Si vous avez le balisage ci-dessous.AutoPostBack sur le contrôle CheckBox échoue parfois

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

L'application est écrit en C#, mais je havn't a affiché un code réel que tout le code d'utilisateur lié à ce balisage semble fonctionner très bien.

Le problème est que CheckBox chkTVLic a la valeur de validation définie sur false et autopostback sur true. Donc, quoi qu'il arrive quand je coche et décoche la case à cocher cela devrait être publié. La plupart du temps c'est exactement ce qu'il fait et le résultat est d'afficher et de cacher pnlTVLic quand il est coché et non coché. Cependant, s'il y en a un sur les validateurs du tableau de bord, la case à cocher ne provoque pas de publication la première fois. Il le fera tous les temps suivants mais jamais le premier. Cependant, il devrait TOUJOURS provoquer une publication. Qu'est-ce qui pourrait l'arrêter? Avant que quelqu'un demande il n'y a pas d'utilisation du code côté client écrit, tout est pur. Net markup et C# code.

+0

Pourquoi le CheckBox devrait-il provoquer une publication, lorsqu'un déclencheur de validation se déclenche? Il fera une publication chaque fois que l'utilisateur clique dessus, AFAIK. – Marcel

+0

Il s'agit d'un article très ancien, mais je ne voulais pas dire qu'une case à cocher devrait être validée lorsqu'un validateur se déclenche. C'est ce qu'il devrait faire une publication chaque fois qu'un utilisateur clique dessus, quel que soit l'état de validation des autres contrôles. Cependant, le comportement était que cela fonctionnait bien si aucun des validateurs n'avait tiré et renvoyé comme prévu, mais si l'un des validateurs avait viré, vous deviez cliquer deux fois pour le renvoyer. –

Répondre

1

Je ne vois pas pourquoi il ne devrait pas postback lorsque vous check/uncheck le checkbox, mais si le seul but de cette case à cocher est hide/unhide un panneau, je préférerais le faire en javascript. Faire une publication complète sur le serveur juste pour cacher un panneau semble vraiment mauvais.

javascript vous pouvez le faire pour cacher le panneau:

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

Et ceci pour montrer:

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

Il va être tellement plus vite et mieux. Mettez simplement une case à cocher ordinaire au lieu de celle d'ASP.NET et abonnez-vous à l'événement onclick.


Désolé, un autre commentaire:

Je pense que vous avez tort quand vous dites que la case à cocher doit toujours faire un postback. Non, si l'un des validateurs se déclenche à l'intérieur du panneau, la case à cocher ne provoque pas de publication tant que la condition n'est pas remplie.

+0

NON il ne devrait pas, il a causevalidation mis à false, il devrait ignorer tous les validateurs et poster indépendamment. Ce qui est ce qu'il fait, 2 et toutes les autres fois. Je sais comment afficher et masquer un div en javascript, la raison pour laquelle il provoque un retour car il y a un autre traitement côté serveur qui doit avoir lieu. Tant que la case à cocher publie tout ce qui est dandy. –

+0

Benn, vous avez raison. J'ai un peu googlé et il semble que c'est un problème connu. Que diriez-vous de faire le tout de javascript de toute façon? Je veux dire, cacher/afficher le panneau, puis simplement faire un formulaire. – Icarus

+0

Oui, c'est pour environ 40 cases à cocher beaucoup de travail de recodage dans JS. –

0

C'est ce que j'ai fait et cela a fonctionné. sur checkbox événement onclick J'ai désactivé tous les contrôles validation et immédiatement fait Page_ClientValidate(); et cela a fonctionné.