ASP.NET Case à cocher ne pas le feu CheckedChanged événement lors de la désactivation de
J'ai une Case à cocher sur un ASP.NET la Forme du Contenu comme suit:
<asp:CheckBox runat="server" ID="chkTest" AutoPostBack="true" OnCheckedChanged="chkTest_CheckedChanged" />
Dans mon code derrière j'ai la méthode suivante:
protected void chkTest_CheckedChanged(object sender, EventArgs e)
{
}
Lorsque je charge la page dans le navigateur et cliquez sur la Case à cocher, il devient cochée, la page enregistre, et je peux voir chkTest_CheckedChanged
appelé.
Quand je puis cliquez sur la Case à cocher à nouveau, il devient pas cochée, la page enregistre, cependant chkTest_CheckedChanged
n'est pas appelé.
Le processus est reproductible, donc une fois que la Case n'est pas cochée, la vérification, cela va déclencher l'événement.
J'ai Vue l'État désactivé dans le Web.Config, permettant à l'État d'Affichage des causes de ce problème à disparaître. Que puis-je faire pour avoir des événements fiables de tir, tandis que le point de Vue de l'État reste désactivé?
Mise à jour:
Si j'ai mis Checked="true"
sur le serveur de la balise de la situation est inversée avec l'événement déclenche lorsque décochant la Case, mais pas l'inverse.
Mise à jour 2:
J'ai surchargé OnLoadComplete
dans ma page et de l'intérieur de là, je peux confirmer que Request.Form["__EVENTTARGET"]
est correctement réglé pour l'ID de ma Case.
- cela arrive à moi aussi, pourquoi a-t-il arriver? aucune info? toute la lumière au bout du tunnel (qui isnt va courir sur moi)?
- il aidera si vous pouvez poster le code de votre événement Page_Load
- Il n'y a rien dans l'événement Page_Load. Tout le code est dans le post original.
Vous devez vous connecter pour publier un commentaire.
La mise en œuvre d'une coutume Case qui stocke les
Checked
propriété dansControlState
plutôt queViewState
sera probablement résoudre ce problème, même si la case à cocher aAutoPostBack=false
Contrairement à ViewState, ControlState ne peut pas être désactivé et peut être utilisé pour stocker des données est essentielle pour le contrôle du comportement.
Je n'ai pas de visual studio environnement dès maintenant pour tester, mais qui devrait ressembler à ceci:
plus d'infos ici.
À feu CheckedChanged événement définissez les propriétés suivantes pour la Case, propriété AutoPostBack doit être vrai et doit avoir une valeur par défaut cochée faux ou vrai.
Il n'a pas le feu parce qu'avec l'état d'affichage désactivé le code du serveur ne sait pas que la case était déjà cochée, donc il ne sait pas l'état a changé. Aussi loin que asp.net sait le contrôle de case à cocher est désactivée avant la publication et est toujours désactivée. Ce qui explique aussi le comportement inverser vous voir lors de la configuration de
Checked="true"
.C'est un vieux post, mais je me devais de partager ma solution simple pour aider les autres qui ont cherché pour ce problème.
La solution est simple: Tour sur AutoPostBack.
Je ne suis pas sûr mais je pense que ma solution est de travailler uniquement pour .NET Framework 4.0:
Utilisation
ViewStateMode = "Disabled"
pour désactiver l'affichage de l'état insted deEnableViewState="false"
. Ce garde le même comportement sauf que vous pouvez enregistrer une vue locale de l'état.Donc, sur votre case, définissez l'attribut
ViewStateMode = "Enabled"
et le problème est résolu, sans l'application d'une coutume case.J'ai envie d'organiser un peu les choses, donc j'ai juste passé un peu de temps à tester une solution pour cela.
joshb est correct avec son explication pour pourquoi la Case à cocher se comporte de cette façon.
Que je ne sais pas comment j'ai eu autour de cette dernière année, ou même si je l'ai fait (je ne me souviens pas ce que je travaillais à l'époque pour vérifier), j'ai mis en place une solution simple/solution de contournement.
Si vous vous inscrivez maintenant CheckBox2 dans votre page et l'utiliser à la place de votre standard Cases à cocher, vous obtiendrez la CheckedChanged événement déclenché que vous attendez avec ViewState désactivé et AutoPostBack activé.
La façon dont cela fonctionne est de permettre à la normale Case pour faire sa chose avec la validation et le changement de la vérification, mais ensuite effectue une vérification supplémentaire pour voir si elle était la cible de l'événement qui a provoqué la publication. Si il a été la cible, elle renvoie true pour indiquer le cadre d'élever le CheckedChanged événement.
Edit:
Veuillez noter que ceci ne résout le problème pour AutoPostBack sur la Case à cocher. Si la Publication est appelé à partir d'autre chose (un bouton, par exemple), la CheckedChanged événement présente encore observés problème.
J'ai eu le même problème. J'ai passé beaucoup de temps sur elle et avoir enfin résolu.
Dans mon cas, le
Checkbox
était désactivé par défaut:Il tourne
ViewState
n'est pas chargé pour les personnes handicapées ou invisible contrôles.Donc, supprimer
Enabled="false"
ouVisible="false"
et il fonctionnera comme expeceted. Et bien sûrViewState
ne devrait pas être désactivé.En outre: Vérifier d'éventuelles erreurs dans la console JavaScript.
J'ai connu exactement le même problème décrit par l'OP, sauf qu'il ne s'est produit dans Safari (
checkbox
a bien fonctionné dans Chrome et Firefox). Lors de l'inspection de la console JavaScript, j'ai trouvé une erreur a été d'être jeté par un mal forméjQuery
sélecteur.Dans mon cas, j'ai eu
$('a[id*=lbView')
qui était à côté d'une clôture]
. Cela a jeté une erreur dans Safari mais, étonnamment, pas dans Chrome ni Firefox.La super réponse facile est de définir la
ViewState
pour que l'on contrôle.Il suffit d'ajouter le
EnableViewState="true"
à laAutoPostBack="true"
propriété dans la case de la balise.