2009-10-06 14 views
20

Abbiamo una casella di controllo inizialmente disabilitata e selezionata. Viene quindi abilitato sul lato client tramite javascript. Se l'utente deseleziona la casella e preme il pulsante per richiamare un postback, lo stato della casella di controllo rimane come controllato sul lato server. Questo è ovviamente un comportamento indesiderato. Ecco un esempio.Il valore della casella di controllo ASP.Net al postback è errato?

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

E il codice lato server:

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

Così abbiamo rompere alla linea "stringa h" e verificare il valore di CheckBox1.Checked. È vero, anche se è deselezionato nel modulo.

+0

Questo perché lo stato di visualizzazione della pagina non è sempre aggiornato quando si imposta la proprietà del tuo controllo dal codice sottostante. –

+0

Invece del controllo del server usa un controllo HTML e credo che il tuo problema sia risolto. –

+1

@ Kamran, Viewstate non è il problema. –

risposta

32

Questo è un problema noto con ASP.NET - per qualche motivo ASP.NET non aggiornerà una casella di controllo sul postback se è stata disabilitata durante il caricamento della pagina e non è stata verificata la postback. Non so esattamente perché sia ​​così: se la casella di controllo viene deselezionata per impostazione predefinita e la selezioni, il valore viene modificato correttamente sul server.

La soluzione alternativa consiste nell'aggiungere un campo nascosto alla pagina che rappresenta lo stato della casella di controllo, quindi aggiornare il valore del campo su "ON" o "OFF" ad esempio, ogni volta che si fa clic sulla casella di controllo.

Quindi sul server si controlla il valore del campo nascosto, non la casella di controllo stessa, poiché il campo nascosto viene sempre pubblicato.

+0

Questo funziona. Grazie. – Anthony

+2

Ciao Sam, potresti fornire maggiori informazioni sul "problema di Konown"? KB o link? Ho una casella di controllo con "deseleziona" mancante; abilitato == True, checked = false quando si esce da OnInit; abilitato == True, checked = true quando si immette Page_load; Ma è deselezionato dal browser, e funziona come previsto se ci fosse un altro postback di sincronizzazione non sincronizzato avvenuto prima. –

1

Poiché stai già utilizzando Javascript per manipolare lo stato dei controlli nel browser, ti suggerisco di disattivare la casella di controllo sull'evento di caricamento della pagina. Allora la vostra postback funzionano bene ...

<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

Ho fatto qualcosa di simile a quello del mio progetto. Tuttavia, non è molto buono per la sicurezza. Se l'utente disabilita Javascript, sarebbe fondamentalmente in grado di selezionare la casella e premere Salva senza ostacolare. –

1

I possono non capire il problema in modo corretto, ma non puoi semplicemente usare il modulo dalla richiesta per recuperare il valore CheckBox? Quindi, in button2Click() nel codice dietro file che desideri fare questo:

Request.Form[CheckBox1.UniqueID] 
+2

No, i browser non sono obbligati a postback dei valori degli elementi del modulo disabilitati. – Tommy

12

Ho avuto un problema simile a questo, dove la proprietà Checked dell'oggetto CheckBox non veniva aggiornato correttamente, per ottenere il valore effettivo registrato è possibile CHECK:

Request.Form[CheckBox1.UniqueID] 

sarà 'on', se la casella è selezionata e nulla in caso contrario.

+0

(6 anni dopo ...) È strano. La mia app ASP.Net riporta "a volte" il valore Checked errato per la mia casella di controllo ASP.Net e * talvolta * questo suggerimento funziona ... altre volte genera un'eccezione poiché il valore di questo controllo non è presente nella richiesta. Valore della forma ... –

0

È possibile utilizzare qualcosa di simile.

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

Se non è selezionato, non lo passerà in primo luogo, ma questo dovrebbe spiegarlo.

0

Ecco una soluzione alternativa se è necessario evitare di ricompilare il codice sorgente. Abilita semplicemente la casella di controllo per una frazione di secondo prima di inviare il modulo. 1: Aggiungere il seguente parametro al pulsante di invio: OnClientClick="EnableCheckbox()" 2: Aggiungi questa semplice funzione da qualche parte sulla pagina per abilitarla

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