web-dev-qa-db-fra.com

La valeur de la case à cocher ASP.Net à la publication est incorrecte?

Nous avons une case à cocher qui est initialement désactivée et cochée. Il est ensuite activé côté client via javascript. Si l'utilisateur décoche ensuite la case et appuie sur le bouton pour appeler une publication (postback), l'état de la case à cocher reste tel que coché côté serveur. Ceci est évidemment un comportement indésirable. Voici un exemple.

<%@ 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 = "";
        }
    }
}

Nous rompons donc à la ligne "chaîne h" et vérifions la valeur de CheckBox1.Checked. C'est vrai, même si c'est décoché dans le formulaire.

21
Anthony

Il s'agit d'un problème connu avec ASP.NET. Pour une raison quelconque, ASP.NET ne mettra pas à jour une case à cocher lors de la publication si elle a été désactivée pendant le chargement de la page et si elle n'a pas été cochée. Je ne sais pas exactement pourquoi. Si vous décochez la case et la désélectionnez par défaut, la valeur est modifiée correctement sur le serveur.

La solution de contournement consiste à ajouter un champ masqué à la page qui représente l'état de la case à cocher, puis mettez à 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 masqué, pas la case à cocher elle-même, car le champ masqué est toujours publié.

34
Sam

J'ai eu un problème similaire à celui-ci où la propriété Checked de l'objet CheckBox n'était pas mise à jour correctement. Pour obtenir la valeur publiée réelle, vous pouvez vérifier:

Request.Form[CheckBox1.UniqueID]

il sera 'activé' si la case est cochée et nul sinon.

12
Kurt Vining

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 sur l'événement de chargement de page à la place. Ensuite, vos publications fonctionneront 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>
1
Jakob Gade

Je ne comprends peut-être pas le problème correctement, mais vous ne pouvez pas simplement utiliser le formulaire de la demande pour récupérer la valeur CheckBox? Donc, dans button2Click() dans le code derrière le fichier, vous feriez ceci:

Request.Form[CheckBox1.UniqueID]
1
goku_da_master

Vous pouvez utiliser quelque chose comme ça.

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

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

0
Underground

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

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