2010-10-05 11 views

Respuesta

33

Así que sé que todos han mostrado el enfoque básico del lado del cliente, y eso está bien, pero al menos quería mostrar una solución para manejar un evento específico del lado del cliente en el servidor.

Echemos un vistazo al código y lo repasemos pieza por pieza.

Como ASP.Net TextBox no expone un evento del lado del servidor para OnBlur, tendrá que hacerlo manualmente. Afortunadamente, esto es bastante fácil de lograr. Supongamos que tiene este pequeño fragmento de código en su página .aspx. Desea actualizar un servidor de control de etiquetas cuando el cuadro de texto pierda el foco.

<asp:Label ID="lblOnBlur" runat="server">On Blur Example</asp:Label><br /> 
<asp:TextBox ID="tbOnBlur" runat="server" ClientIDMode="Static" /><br /> 
<asp:Label ID="lblOutput" runat="server" /> 

ASP.Net ha construido en un client side function que es llamada para activar las devoluciones de datos que toma dos parámetros:

  1. destino (el ID del control haciendo que el evento)
  2. Argumento (información opcional que le gustaría transmitir al servidor)

usted podía simplemente wireup el evento en el marcado por añadir el siguiente atributo y valor a su Cuadro de texto:

onblur="__doPostBack('tbOnBlur','OnBlur');" 

Sin embargo, el marco tiene una forma fácil de generar esta secuencia de comandos para que el lado del servidor. En el método de Page_Init, sólo tiene que añadir una llamada a GetPostBackEventReference y asignarlo a la "onBlur" atributo para controlar de este modo:

protected void Page_Init(object sender, EventArgs e) 
{ 
    var onBlurScript = Page.ClientScript.GetPostBackEventReference(tbOnBlur, "OnBlur"); 
    tbOnBlur.Attributes.Add("onblur", onBlurScript); 
} 

Con eventos de control de servidor estándar, el wireup evento y invocación es manejado automáticamente por usted implementando IPostBackEventHandler. Eso es mucho trabajo para una solución única, así que permite manejarla manualmente inspeccionando los parámetros de solicitud.

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsPostBack) 
    { 
     var ctrlName = Request.Params[Page.postEventSourceID]; 
     var args = Request.Params[Page.postEventArgumentID]; 

     HandleCustomPostbackEvent(ctrlName, args); 
    } 
} 

private void HandleCustomPostbackEvent(string ctrlName, string args) 
{ 
    //Since this will get called for every postback, we only 
    // want to handle a specific combination of control 
    // and argument. 
    if (ctrlName == tbOnBlur.UniqueID && args == "OnBlur") 
    { 
     lblOutput.Text = "On Blur Event Handled Server Side!" + DateTime.Now; 
    } 
} 

Al final, no es muy difícil de simular eventos del lado del servidor, si no le importa la excavación en el marco un poco.

Espero que esto ayude!

Saludos,
Josh

+0

+1 Josh. Eso fue muy informativo de hecho. –

+0

Muchas gracias por su hermosa respuesta Genii. Tu publicación es muy informativa para mí. –

+0

He visto muchas otras sugerencias sobre cómo lograr esto, y su respuesta es de lejos la mejor. ¡Gracias! – Aaron

4
if (!Page.IsPostBack) 
    { 
     txtName.Attributes.Add("onblur","alert('Hello world')"); 
    } 
14

Si desea que el servidor para hacer algo después de que el cuadro de texto pierde el foco puede agregar AutoPostBack = "True" y, si no se desea la devolución de datos para recargar la página entera, use un UpdatePanel:

<asp:ScriptManager ID="ScriptManager1" runat="server" /> 
    <asp:UpdatePanel ID="UpdatePanel1" runat="server"> 
     <ContentTemplate> 
      <asp:TextBox ID="TextBox1" runat="server" AutoPostBack="true" 
          OnTextChanged="TextBox1_TextChanged" /> 
     </ContentTemplate> 
    </asp:UpdatePanel> 

La función TextBox1_TextChanged puede hacer algo con el texto (en el lado del servidor).

+0

Fuera de interés - ¿cómo detener el UpdatePanel de la recarga de la página entera – Kamal

+0

@Kamal ... no lo hace.Un panel de actualización no hace nada para evitar que la página completa se cargue en el servidor. Esencialmente, lo que sucede es que se realiza una devolución de datos del lado del cliente utilizando XmlHttpRequest y, a continuación, todos los contenidos, excepto el contenido de UpdatePanel, se descartan y devuelven. Alivia el "parpadeo" de una devolución de datos normal, pero no ahorra tiempo de procesamiento en el servidor. – Josh

+4

Recarga toda la página, pero solo envía el html de los paneles de actualización y algunos javascript para actualizar los contenidos en la respuesta. La respuesta puede ser mucho menor que la descarga de toda la página y el navegador no tiene que volver a procesar la página. Esto puede acelerar un poco el proceso, el usuario no notará ningún parpadeo y la experiencia será mucho más suave. – Willem

0

¿Por qué no usar eso. LOSTFOCUS trabaja misma con:

OnTextChanged="TextBox_TextChanged"