OnClick vs OnClientHaga clic para obtener un asp: CheckBox?

votos
81

¿Alguien sabe por qué un controlador de javascript en el lado del cliente para asp: CheckBox debe ser un atributo OnClick = en lugar de un atributo OnClientClick = , como para el botón asp:?

Por ejemplo, esto funciona:

<asp:CheckBox runat=server OnClick=alert(this.checked); />

y esto no (no hay error):

<asp:CheckBox runat=server OnClientClick=alert(this.checked); />

pero esto funciona:

<asp:Button runat=server OnClientClick=alert('Hi'); />

y esto no (error de tiempo de compilación):

<asp:Button runat=server OnClick=alert('hi'); />

(Sé para qué sirve Button.OnClick; me pregunto por qué CheckBox no funciona de la misma manera ...)

Publicado el 16/07/2009 a las 03:27
fuente por usuario
En otros idiomas...                            


8 respuestas

votos
8

Tienes razón esto es inconsistente. Lo que está sucediendo es que CheckBox NO TIENE un evento OnClick del lado del servidor, por lo que su marcado se procesa en el navegador. http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.checkbox_events.aspx

Mientras que Button tiene un OnClick, ASP.NET espera una referencia a un evento en su marcado OnClick.

Respondida el 16/07/2009 a las 03:34
fuente por usuario

votos
98

Eso es muy raro Revisé la página de documentación CheckBox que se lee

<asp:CheckBox id="CheckBox1" 
     AutoPostBack="True|False"
     Text="Label"
     TextAlign="Right|Left"
     Checked="True|False"
     OnCheckedChanged="OnCheckedChangedMethod"
     runat="server"/>

Como puede ver, no hay atributos OnClick o OnClientClick definidos.

Teniendo esto en cuenta, creo que esto es lo que está sucediendo.

Cuando haces esto,

<asp:CheckBox runat="server" OnClick="alert(this.checked);" />

ASP.NET no modifica el atributo OnClick y lo representa tal como está en el navegador. Se representaría como:

  <input type="checkbox" OnClick="alert(this.checked);" />

Obviamente, un navegador puede entender 'OnClick' y pone una alerta.

Y en este escenario

<asp:CheckBox runat="server" OnClientClick="alert(this.checked);" />

Nuevamente, ASP.NET no cambiará el atributo OnClientClick y lo renderizará como

<input type="checkbox" OnClientClick="alert(this.checked);" />

Como el navegador no comprenderá OnClientClick, nada sucederá. Tampoco generará ningún error ya que es solo otro atributo.

Puede confirmar arriba mirando el HTML renderizado.

Y sí, esto no es intuitivo en absoluto.

Respondida el 16/07/2009 a las 03:35
fuente por usuario

votos
8

Porque son dos tipos diferentes de controles ...

Usted ve, su navegador web no sabe acerca de la programación del lado del servidor. solo conoce su propio DOM y los modelos de eventos que utiliza ... Y para los eventos de clic de los objetos que se le presentan. Debería examinar el marcado final que en realidad se envía al buscador desde ASP.Net para ver las diferencias consigo mismo.

<asp:CheckBox runat="server" OnClick="alert(this.checked);" />

rinde a

<input type="check" OnClick="alert(this.checked);" />

y

<asp:CheckBox runat="server" OnClientClick="alert(this.checked);" />

rinde a

<input type="check" OnClientClick="alert(this.checked);" />

Ahora, tan cerca como puedo recordar, no hay navegadores en ningún lado que soporten el evento "OnClientClick" en su DOM ...

En caso de duda, siempre vea la fuente de la salida a medida que se envía al navegador ... hay un mundo de información de depuración que puede ver.

Respondida el 16/07/2009 a las 03:39
fuente por usuario

votos
1

Yo estaba limpiando las advertencias y mensajes y veo que VS advierte al respecto: Validación (ASP.Net): Atributo 'onclick' no es un atributo válido del elemento 'casilla'. Utilice el control de entrada del HTML para especificar un manejador lado del cliente y entonces no tendrá la etiqueta span extra y los dos elementos.

Respondida el 03/10/2010 a las 21:56
fuente por usuario

votos
5

Para aquellos de ustedes que llegaron aquí buscando el lado del servidor OnClickcontrolador esOnCheckedChanged

Respondida el 29/11/2012 a las 17:00
fuente por usuario

votos
-1

Una solución es con jQuery:

$(document).ready(
    function () {
        $('#mycheckboxId').click(function () {
               // here the action or function to call
        });
    }
);
Respondida el 19/01/2015 a las 16:17
fuente por usuario

votos
0

Usted puede hacer la etiqueta de la siguiente manera:

<asp:CheckBox runat="server" ID="ckRouteNow" Text="Send Now" OnClick="checkchanged(this)" />

La propiedad .checked en la llamada JavaScript será correcto ... el estado actual de la casilla de verificación:

  function checkchanged(obj) {
      alert(obj.checked)
  }
Respondida el 14/02/2018 a las 18:28
fuente por usuario

votos
0

Asp.net casilla de verificación no se soporta el método OnClientClick.
Si desea agregar algo de JavaScript evento para ASP: CheckBox hay que añadir los atributos relacionados en "Pre_Render" o en "eventos Page_Load" en el código del servidor:

DO#:

    private void Page_Load(object sender, EventArgs e)
    {
        SomeCheckBoxId.Attributes["onclick"] = "MyJavaScriptMethod(this);";
    }

Nota: Asegúrese de no establece AutoEventWireup = "false" en el encabezado de la página.

VB:

    Private Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
        SomeCheckBoxId.Attributes("onclick") = "MyJavaScriptMethod(this);"
    End Sub
Respondida el 19/12/2018 a las 12:29
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more