83 votes

OnClick vs OnClientClick pour un asp : CheckBox ?

Personne ne sait pourquoi un javascript côté client gestionnaire pour l'asp:Case à cocher doit être un OnClick=" attribut" plutôt que d'une OnClientClick=" attribut", comme pour l'asp:Button?

Par exemple, cela fonctionne:

<asp:CheckBox runat="server" OnClick="alert(this.checked);" />

et ce n'est pas (pas d'erreur):

<asp:CheckBox runat="server" OnClientClick="alert(this.checked);" />

mais cela fonctionne:

<asp:Button runat="server" OnClientClick="alert('Hi');" />

et ce n'est pas (erreur de compilation):

<asp:Button runat="server" OnClick="alert('hi');" />

(Je sais ce Bouton.OnClick; je me demandais pourquoi la Case à cocher ne fonctionne pas de la même façon...)

107voto

SolutionYogi Points 16697

C'est très bizarre. J'ai coché la Case page de documentation qui se lit

<asp:CheckBox id="CheckBox1" 
     AutoPostBack="True|False"
     Text="Label"
     TextAlign="Right|Left"
     Checked="True|False"
     OnCheckedChanged="OnCheckedChangedMethod"
     runat="server"/>

Comme vous pouvez le voir, il n'y a pas de OnClick ou OnClientClick attributs définis.

En gardant cela à l'esprit, je pense que c'est ce qui se passe.

Lorsque vous faites cela,

<asp:CheckBox runat="server" OnClick="alert(this.checked);" />

ASP.NET ne pas modifier l'attribut OnClick et affiche sur le navigateur. Il serait traduit comme:

  <input type="checkbox" OnClick="alert(this.checked);" />

De toute évidence, un navigateur peut comprendre "OnClick" et met une alerte.

Et dans ce scénario

<asp:CheckBox runat="server" OnClientClick="alert(this.checked);" />

Encore une fois, ASP.NET ne changera pas le OnClientClick attribut et le rendre comme

<input type="checkbox" OnClientClick="alert(this.checked);" />

En tant que navigateur ne permet pas de comprendre OnClientClick rien ne se passera. Il aussi de ne pas soulever d'erreur car il est juste un autre attribut.

Vous pouvez le vérifier ci-dessus en regardant le rendu HTML.

Et oui, ce n'est pas du tout intuitif.

9voto

datacop Points 568

Parce qu'ils sont deux différents types de contrôles...

Vous voyez, votre navigateur web ne connaît pas la programmation côté serveur. il ne sait que sur ses propres DOM et les modèles d'événement qu'il utilise... Et pour cliquez sur les événements des objets rendus. Vous devriez examiner la finale de balisage qui est envoyé au navigateur de ASP.Net pour voir les différences de votre auto.

<asp:CheckBox runat="server" OnClick="alert(this.checked);" />

rend à

<input type="check" OnClick="alert(this.checked);" />

et

<asp:CheckBox runat="server" OnClientClick="alert(this.checked);" />

rend à

<input type="check" OnClientClick="alert(this.checked);" />

Maintenant, aussi loin que je peux me rappeler, il n'y a pas des navigateurs n'importe où à l'appui de la "OnClientClick" événement dans leur DOM...

En cas de doute, toujours d'afficher la source de la sortie comme il est envoyé au navigateur... il y a tout un monde d'informations de débogage que vous pouvez voir.

8voto

russau Points 4835

Vous avez raison que c’est incompatible. Ce qui se passe, c’est que CheckBox n’a pas un événement OnClick côté serveur, ainsi votre balisage obtient restitué dans le navigateur. http://msdn.Microsoft.com/en-US/Library/System.Web.UI.WebControls.checkbox_events.aspx

Alors que le bouton a-t-il un OnClick - si ASP.NET attend une référence à un événement dans votre balisage OnClick.

6voto

Serj Sagan Points 2731

Pour ceux d'entre vous qui ont obtenu ici vous cherchez du côté serveur Gestionnaire c’est

1voto

BrianK Points 589

Je nettoyais des avertissements et de messages et de voir que VS indique à ce sujet : Validation (ASP.Net) : attribut « OnClick » n’est pas un attribut valide de l’élément « CheckBox ». Utilisez le contrôle d’entrée html pour spécifier un gestionnaire du côté client et puis vous n’obtiendrez pas la balise span supplémentaire et les deux éléments.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X