2009-10-06 6 views
20

Tenemos una casilla de verificación que inicialmente está desactivada y marcada. Luego se habilita en el lado del cliente a través de javascript. Si el usuario luego desmarca la casilla y presiona el botón para invocar una devolución de datos, el estado de la casilla de verificación permanece como verificado en el lado del servidor. Esto es obviamente un comportamiento indeseable. Aquí hay un ejemplo.El valor de casilla de verificación de ASP.Net en la devolución de datos es incorrecto?

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

Y el código del lado del servidor:

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

Así que rompen en la línea de "cadena H" y comprobar el valor de CheckBox1.Checked. Es cierto, incluso si no está marcado en el formulario.

+0

Esto es debido a que el estado de vista de su página no está siendo actualizado cuando se establece el propiedades de su control del código detrás. –

+0

En lugar de controlar el servidor, use un control HTML y creo que su problema está resuelto. –

+1

@ Kamran, Viewstate no es el problema. –

Respuesta

32

Este es un problema conocido con ASP.NET: por alguna razón, ASP.NET no actualizará una casilla de verificación en la devolución de datos si se deshabilitó durante la carga de la página y no se verificó su devolución. Sin embargo, no sé exactamente por qué: si desactiva la casilla de verificación por defecto y la selecciona, el valor se cambia correctamente en el servidor.

La solución alternativa es agregar un campo oculto a la página que representa el estado de la casilla de verificación, luego actualizar el valor del campo a "ON" u "OFF" por ejemplo, siempre que se haga clic en la casilla de verificación.

Luego, en el servidor, verifica el valor del campo oculto, no la casilla de verificación en sí, ya que el campo oculto siempre se publica.

+0

Esto funciona. Gracias. – Anthony

+2

Hola Sam, ¿podrías darnos más información sobre el "problema de Konown"? KB o enlace? Tengo una casilla con "desmarcar"; enabled == Verdadero, marcado = falso al salir de OnInit; enabled == Verdadero, marcado = verdadero al ingresar Page_load; Pero está desmarcado del navegador, y funciona como se esperaba si hubo otro evento asíncrono antes sucedido. –

1

Dado que ya está utilizando Javascript para manipular el estado de los controles en el navegador, le sugiero que simplemente deshabilite la casilla de verificación en el evento de carga de página en lugar. A continuación, sus devoluciones de datos funcionará 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

Hice algo similar a eso en mi proyecto. Sin embargo, no es muy bueno para la seguridad. Si el usuario deshabilita Javascript, básicamente podría marcar la casilla y presionar Guardar sin obstaculizar. –

1

que no pueden entender el problema correctamente, pero no puedes usar el formulario de la solicitud para recuperar el valor CheckBox? Así que en button2Click() en el código detrás de archivo que hace esto:

Request.Form[CheckBox1.UniqueID] 
+2

No, los navegadores no están obligados a devolver los valores de los elementos de formulario deshabilitados. – Tommy

12

que tenía un problema similar a este, donde la propiedad Checked del objeto CheckBox no se actualizaba correctamente, para obtener el valor real que pueda publicado cheque:

Request.Form[CheckBox1.UniqueID] 

estará 'on' si la casilla está marcada y nula si no.

+0

(6 años después ...) Es extraño. Mi aplicación ASP.Net está "a veces" informando el valor Checked incorrecto para mi casilla de verificación ASP.Net, y * a veces * esta sugerencia funciona ... otras veces arroja una excepción ya que el valor de este control no se encuentra en la Solicitud. Valor de forma ... –

0

Puede usar algo como esto.

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

Si no está marcada, no pasará en primer lugar, pero esto debería explicar eso.

0

Aquí hay una solución alternativa si necesita evitar la recompilación de su código fuente. Simplemente habilita la casilla de verificación por una fracción de segundo antes de enviar el formulario. 1: Agregue el siguiente parámetro a su botón de envío: OnClientClick="EnableCheckbox()" 2: Añadir esta función simple lugar de la página para que pueda

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