2009-10-06 6 views
20

Nous avons une case à cocher qui est initialement désactivée et vérifiée. Il est ensuite activé du côté client via javascript. Si l'utilisateur désactive alors la case et appuie sur le bouton pour invoquer une publication, l'état de la case à cocher reste tel que vérifié côté serveur. C'est évidemment un comportement indésirable. Voici un exemple.ASP.Net La valeur de la case à cocher lors de la publication est incorrecte?

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="testcb.aspx.cs" Inherits="ESC.testcb" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 

    <title></title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <script type="text/javascript"> 
     function buttonClick() { 
      var cb = document.getElementById('<%= CheckBox1.ClientID %>'); 
      cb.disabled = false; 
      cb.parentNode.disabled = false; 
     } 


    </script> 

    <div> 
     <asp:CheckBox ID="CheckBox1" runat="server" Checked="true" Enabled="false" /> 
     <asp:Button ID="Button1" runat="server" Text="Button" OnClientClick="buttonClick(); return false;" /> 
     <asp:Button ID="Button2" runat="server" Text="Button2" OnClick="button2Click" /> 
    </div> 
    </form> 
</body> 
</html> 

Et le code côté serveur:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

namespace ESC 
{ 
    public partial class testcb : System.Web.UI.Page 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 
     } 

     protected void button2Click(object sender, EventArgs e) 
     { 
      string h = ""; 
     } 
    } 
} 

Donc nous cassons à la ligne "chaîne h" et vérifier la valeur de CheckBox1.Checked. C'est vrai, même s'il n'est pas coché sur le formulaire.

+0

En effet, l'état d'affichage de votre page ne reçoit pas mis à jour lorsque vous définissez la propriétés de votre contrôle du code derrière. –

+0

Au lieu de contrôler le serveur, utilisez un contrôle HTML et je crois que votre problème est résolu. –

+1

@ Kamran, Viewstate n'est pas le problème. –

Répondre

32

Ceci est un problème connu avec ASP.NET - pour une raison quelconque, ASP.NET ne mettra pas à jour une case à cocher sur la publication si elle a été désactivée pendant le chargement de la page et non vérifiée pour la publication. Je ne sais pas exactement pourquoi c'est le cas - si vous désactivez la case à cocher par défaut et que vous la sélectionnez, la valeur est modifiée sur le serveur correctement. La solution consiste à ajouter un champ caché à la page qui représente l'état de la case à cocher, puis à mettre à jour la valeur du champ sur "ON" ou "OFF" par exemple, chaque fois que la case est cochée.

Ensuite, sur le serveur, vous vérifiez la valeur du champ caché, pas la case à cocher elle-même, car le champ caché est toujours affiché.

+0

Cela fonctionne. Merci. – Anthony

+2

Salut Sam, pourriez-vous donner plus d'informations sur le "problème de Konown"? Ko ou lien? J'ai une case à cocher avec "uncheck" manquant; enabled == True, checked = false en quittant OnInit; enabled == True, vérifié = true lors de l'entrée de Page_load; Mais il est décoché du navigateur, et il fonctionne comme prévu s'il y avait un autre asyncpostback inachevé avant. –

1

Puisque vous utilisez déjà Javascript pour manipuler l'état des contrôles dans le navigateur, je vous suggère de désactiver la case à cocher de l'événement de chargement de la page. Ensuite, vos postbacks fonctionnera très bien ...

<head> 

    <script type="text/javascript"> 
    function buttonClick() { 
     var cb = document.getElementById('<%= CheckBox1.ClientID %>'); 
     cb.disabled = false; 
     cb.parentNode.disabled = false; 
    }  
    </script> 

</head> 
<body onload="document.getElementById('<%= CheckBox1.ClientID %>').disabled = true;"> 
    <form id="form1" runat="server"> 
    <div> 
    <asp:checkbox id="CheckBox1" runat="server" checked="true" /> 
    <asp:button id="Button1" runat="server" text="Button" onclientclick="buttonClick(); return false;" /> 
    <asp:button id="Button2" runat="server" text="Button2" onclick="button2Click" /> 
    </div> 
    </form> 
</body> 
+0

J'ai fait quelque chose de similaire à cela dans mon projet. Ce n'est pas très bon pour la sécurité cependant. Si l'utilisateur désactive le Javascript, il devrait pouvoir cocher la case et appuyer sur Enregistrer sans gêner. –

1

Je ne peux pas comprendre correctement le problème, mais ne peut pas vous suffit d'utiliser le formulaire de la demande de récupérer la valeur CheckBox? Ainsi, dans button2Click() dans le code derrière le fichier que vous feriez ceci:

Request.Form[CheckBox1.UniqueID] 
+2

Non, les navigateurs ne sont pas tenus de publier des valeurs d'éléments de formulaire désactivés. – Tommy

12

J'ai eu un problème similaire à celui où la propriété de l'objet vérifié CheckBox n'a pas été mis à jour correctement, pour obtenir la valeur réelle affichée vous pouvez check:

Request.Form[CheckBox1.UniqueID] 

il sera 'activé' si la case est cochée et null si ce n'est pas le cas.

+0

(6 ans plus tard ...) C'est bizarre. Mon application ASP.Net signale «parfois» la valeur Checked incorrecte pour ma case à cocher ASP.Net, et * parfois * cette suggestion fonctionne ... d'autres fois elle déclenche une exception car la valeur de ce contrôle n'est pas trouvée dans la demande. Valeur du formulaire ... –

0

Vous pouvez utiliser quelque chose comme ceci.

if ((Request.Params["Checkbox1"] ?? "").ToString() == "on") 

Si elle n'est pas cochée, elle ne le passera pas en premier lieu, mais cela devrait en tenir compte.

0

Voici une solution alternative si vous devez éviter de recompiler votre code source. Il active juste la case à cocher pour une fraction de seconde avant de soumettre le formulaire. 1: Ajoutez le paramètre suivant à votre bouton Soumettre: OnClientClick="EnableCheckbox()" 2: Ajouter cette fonction simple, quelque part sur la page pour activer

<script> 
     function EnableCheckbox() { 
      document.getElementById("<%=chkMyCheckbox.clientID %>").disabled = false; 
     } 
</script>