2009-06-17 7 views
6

estoy tratando de comprender plenamente el modelo de eventos de formulario Web (no la página de ciclo de vida, pero ¿cómo los eventos se conectan cuando se especifique de forma declarativa en el .aspx o .ascx.¿Por qué los eventos de WebControl tienen el prefijo "Encendido"?

Tome el control de botón, por ejemplo. Es tiene un evento Click que puede conectar en el código subyacente, pero tiene un evento "OnClick" en el archivo .aspx/.ascx.

Utilicé el reflector .NET y el control Button tiene un OnClick PROTEGIDO método, pero que no debería estar disponible para ser asignado por el .aspx/.ascx. A menos que me falta algo.

¿Alguien sabe por qué se agrega el prefijo "Encendido"?

Solo para aclarar un poco: Entiendo que la convención de nomenclatura funciona. Me gustaría saber cómo se traduce el "OnClick" en .aspx/.ascx en .Click + = new EventHandler (blahName); Es decir. si creo un ControlChanged EventHandler, ¿tengo que hacer algo especial para que el OnControlChanged se muestre de manera válida en el archivo .aspx/.ascx?

+0

Vea también:> [¿Cómo es que los atributos de las propiedades del controlador de eventos en los controles ASP.NET tienen un prefijo (OnLoad para el controlador de eventos Load)] (http://stackoverflow.com/questions/969128/how-come- the-attributes-for-event-handler-properties-on-asp-net-controls-have-ap) –

Respuesta

4

Es más que una convención de nomenclatura porque los eventos en los controles de usuario obtienen automáticamente el prefijo "Activado" en la sintaxis declarativa.

Por ejemplo, tengo un UserControl que declara un evento ProjectSelected. Para agregar un controlador declarativamente, establezco el atributo OnProjectSelected.

control de usuario:

 public event EventHandler<ProjectSelectedEventArgs> ProjectSelected; 

Adición de manipulador de forma declarativa:

 <user:ProjectList id="uxProjectList" runat="server" 
      OnProjectSelected="uxProjectList_ProjectSelected" /> 

Adición manejador de código subyacente:

 uxProjectList.ProjectSelected += uxProjectList_ProjectSelected; 

Esto confunde el infierno fuera de mí dos veces, una vez cuando yo no podía No entiendo por qué el evento no estuvo disponible declarativamente, y nuevamente cuando nombré el evento "OnP" rojectSelected "y el atributo se convirtió en" OnOnProjectSelected ".

+0

En realidad, es un poco más profundo que las convenciones utilizadas por Visual Studio IDE. Eventos vs delegados: http://blog.monstuff.com/archives/000040.html –

+0

@ Jason: No encontré ese artículo para ser claro en absoluto. El controlador de eventos para un evento lo define un delegado. Registra los controladores con un evento que se ajusta a la definición del controlador del evento.Para facilitar el manejo de eventos, algunas clases manejan sus propios eventos que llaman a un método "On [Event]" anulable para que los consumidores puedan anular el método en lugar de manejar el evento. ASP.NET parece hacer esto automáticamente para permitir la sintaxis declarativa. –

+0

Disculpas, fue el primer artículo que saqué de Google para ilustrar la diferencia entre los eventos y los delegados, ya que sentí que no fue abordado en su publicación (como debería ser para aclarar la convención "Encendido") –

6

Almacenan referencias a los delegados de que el código de llamada se cableará usando eventos; para distinguir entre el evento mismo y el delegado.

+4

Sí porque "Click" parece que podría estar causando un clic, mientras que "OnClick" es causado por un clic. – ChrisW

2

Es solo una convención de nomenclatura utilizada al generar eventos. OnSomethingHappened ... OnClick, OnChange, OnClose. No creo que haya nada mágico o siniestro, es solo una convención.

0

Semánticamente es básicamente un viejo retroceso a las tradiciones de VB donde los oyentes de eventos generalmente se llamaban OnWhatever. Los viejos hábitos tardan en morir.

Cuestiones relacionadas