web-dev-qa-db-ger.com

ASP.Net Checkbox-Wert bei Postback ist falsch?

Wir haben ein Kontrollkästchen, das anfangs deaktiviert und aktiviert ist. Es wird dann auf der Client-Seite über Javascript aktiviert. Wenn der Benutzer das Kontrollkästchen dann deaktiviert und die Schaltfläche drückt, um ein Postback aufzurufen, bleibt der Status des Kontrollkästchens auf der Serverseite aktiviert. Dies ist offensichtlich unerwünschtes Verhalten. Hier ist ein Beispiel.

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

Und der serverseitige Code:

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

Also brechen wir an der "string h" -Zeile ab und überprüfen den Wert von CheckBox1.Checked. Es ist wahr, auch wenn es in dem Formular deaktiviert ist.

21
Anthony

Dies ist ein bekanntes Problem mit ASP.NET. Aus irgendeinem Grund aktualisiert ASP.NET ein Kontrollkästchen beim Zurücksetzen nicht, wenn es während des Ladens der Seite deaktiviert und nicht auf Zurücksetzen überprüft wurde. Ich weiß nicht genau, warum das so ist. Wenn Sie das Kontrollkästchen standardmäßig deaktivieren und auswählen, wird der Wert auf dem Server korrekt geändert.

Die Problemumgehung besteht darin, der Seite, die den Status des Kontrollkästchens darstellt, ein ausgeblendetes Feld hinzuzufügen und den Wert des Feldes beispielsweise auf "EIN" oder "AUS" zu aktualisieren, wenn das Kontrollkästchen angeklickt wird.

Dann überprüfen Sie auf dem Server den Wert des ausgeblendeten Felds und nicht das Kontrollkästchen selbst, da das ausgeblendete Feld immer angezeigt wird.

34
Sam

Ich hatte ein ähnliches Problem wie dieses, bei dem die Checked-Eigenschaft des Objekts CheckBox nicht korrekt aktualisiert wurde. Um den tatsächlich gebuchten Wert zu erhalten, können Sie Folgendes überprüfen:

Request.Form[CheckBox1.UniqueID]

wenn das Kontrollkästchen aktiviert ist, ist es aktiviert, wenn nicht, ist es deaktiviert.

12
Kurt Vining

Da Sie bereits JavaScript verwenden, um den Status der Steuerelemente im Browser zu ändern, sollten Sie stattdessen nur das Kontrollkästchen für das Ereignis zum Laden der Seite deaktivieren. Dann funktionieren Ihre Postbacks einwandfrei ...

<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

Möglicherweise verstehe ich das Problem nicht richtig, aber können Sie nicht einfach das Formular aus der Anforderung verwenden, um den Wert CheckBox abzurufen? Also würden Sie in button2Click() im Code hinter der Datei Folgendes tun:

Request.Form[CheckBox1.UniqueID]
1
goku_da_master

Sie können so etwas verwenden.

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

Wenn es nicht aktiviert ist, wird es nicht an erster Stelle übergeben, aber dies sollte das berücksichtigen.

0
Underground

Hier ist eine alternative Lösung, wenn Sie das Neukompilieren Ihres Quellcodes vermeiden müssen. Es aktiviert das Kontrollkästchen nur für den Bruchteil einer Sekunde, bevor das Formular gesendet wird. 1: Fügen Sie der Senden-Schaltfläche den folgenden Parameter hinzu: OnClientClick="EnableCheckbox()" 2: Fügen Sie diese einfache Funktion irgendwo auf der Seite hinzu, um sie zu aktivieren

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