La devolución de llamada del cliente de Asp.Net2.0 es un método muy interesante que nos permite controlar qué datos enviar al servidor sin enviar la página completa. Al mismo tiempo, el servidor solo devuelve los datos que necesita sin devolverlos. .página entera.
En primer lugar, tenemos que hablar de un método muy importante: GetCallbackEventRefernce. Anoté mi comprensión. Puede que esté equivocado. ¡Muchas gracias!
GetCallbackEventReference primero implementa el método RaiseCallbackEvent que permite que el script del cliente pase parámetros al servidor y luego devuelve el valor del método RaiseCallBackEvent a un parámetro que usted registró en el método GetCallbackEventRefernce (en realidad, también es un script que desea escribir en el cliente). ). Para llamar a GetCallbackEventRefernce, debe pasarle dos parámetros del script del cliente, uno es el valor que se pasará al evento RaiseCallbackEvent y el otro es el contexto.
El significado de sus parámetros es el siguiente:
Primero: la página o control del servidor que. implementa la interfaz ICallbackEventHandler. Escriba esto para representar la página anterior.
El segundo: representa el valor que desea pasar del cliente al método RaiseCallbackEvent del servidor.
El tercero: una función js que desea escribir en el cliente. Al mismo tiempo, el servidor también pasará los datos calculados a esta función. parámetros de esta función.
Cuarto: no sé exactamente qué significa contexto. El código que GetCallbackEventRefernce envía al cliente es el siguiente:
WebForm_DoCallback('__Page',arg,ReceiveServerData,context,null,false)
Entonces, ¿qué debemos hacer para obtener la solicitud? ¿El cliente? ¿Cómo llamarlo? Vi tres métodos:
El primero: escribir una cadena pública en segundo plano y asignarla en Page_Load: =Page.ClientScript.GetCallbackEventReference(this, "message", "ShowServerTime", "context"); presta atención aquí. Es Page. .ClientScrip, porque devolverá un ClientScriptManager, que gestiona todos los scripts del cliente. Luego, en el evento de clic de un botón en primer plano <%=esa cadena de fondo pública%>, cree un pequeño código experimental de la siguiente manera:
Frontend ServerTime.aspx: por conveniencia, elimine una gran cantidad de HTML inútil
<%@ page language=". C#" CodeFile="ServerTime.aspx.cs" Hereda="ServerTime_aspx" %>
<html>
<cabeza>
<título>Hora del servidor</título>
<script language="javascript">
función GetServerTime()
{
mensaje var = '';
contexto var = '';
<%=sInvocación de función de devolución de llamada%>
}
función ShowServerTime(timeMessage, contexto) {
alert('La hora actual en el servidor es:n' + timeMessage);
}
</guión>
</cabeza>
<cuerpo>
<form id="MainForm" runat="servidor">
<input type="button" value="Obtener hora del servidor" onclick="GetServerTime();"
</formulario>
</cuerpo>
</html>
Backend:
usando Sistema;
usando System.Web.UI
clase parcial pública ServerTime_aspx: Página, ICallbackEventHandler;
{
//Asegúrese de implementar la excusa ICallbackEventHandler public string sCallBackFunctionInvocation
void Page_Load(object sender, System.EventArgs e)
{
sCallBackFunctionInvocation = Page.ClientScript.GetCallbackEventReference(esto, "mensaje", "ShowServerTime", "contexto");
}
cadena pública RaiseCallbackEvent (cadena eventArgument)
{
devolver DateTime.Now.ToString();
}
}
Ejecutar, hacer clic en el botón y el resultado es el siguiente:
Segundo método: en el método anterior, debemos vincular el fondo al primer plano, entonces, ¿qué pasa si no lo vinculamos? Hacemos esto:
usamos directamente GetCallbackEventReference como contenido de implementación en la función js y luego registramos esta función js en el cliente.
Código de TestPage de interfaz de usuario:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="TestPage.aspx.cs" Hereda="TestPage" %>
<html>
<cabeza>
<título>Página sin título</título>
<tipo de script="texto/javascript">
prueba de función()
{
var lb = document.getElementById("Select1");
//El cuadro desplegable que se tomará var con = lb.options[lb.selectedIndex].text;
// Obtenga el texto del cuadro desplegable que seleccionó y luego llame a CallTheServer, que es una función js generada por el servidor CallTheServer(con,'');
}
funciónReceiveServerData(rValue)
{
Resultados.innerHTML = rValue;
}
</guión>
</cabeza>
<cuerpo>
<form id="form1" runat="servidor">
<div>
<seleccione id="Seleccionar1">
<valor de opción=1 seleccionado="seleccionado">Discípulo del ratón</opción>
<valor de opción=2>Maestro Wu Qiwa</opción>
</seleccionar>
<br />
<br />
<input onclick="test()" value="Devolver el texto del cuadro desplegable del servidor" type=button>
<br />
<br />
<span ID="Resultados"></span>
<br />
</div>
</formulario>
</cuerpo>
</html>
Código backend:
usando Sistema;
usando System.Data;
usando System.Configuration;
usando System.Collections;
usando System.Web;
utilizando System.Web.Security;
utilizando System.Web.UI;
usando System.Web.UI.WebControls;
usando System.Web.UI.WebControls.WebParts;
usando System.Web.UI.HtmlControls;
clase parcial pública TestPage: System.Web.UI.Page,System.Web.UI.ICallbackEventHandler
{
Page_Load vacío protegido (remitente del objeto, EventArgs e)
{
String cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context");
Devolución de llamada de cadenaScript;
callbackScript = "función CallTheServer(arg,context)" +"{ " + cbReference + "} ;";
Page.ClientScript.RegisterStartupScript(this.GetType(),"abcdefg",callbackScript, verdadero);
// El cuarto parámetro representa si se agrega automáticamente la etiqueta <script type="text/javascript"></script> al script, por supuesto que se debe agregar}
Cadena pública RaiseCallbackEvent (String eventArgument)
{
return "Lo que seleccionaste es" + eventArgument;
}
}
El siguiente es el resultado de la ejecución:
El tercer tipo: los dos primeros son controles HTML con <input type="botón", entonces, ¿qué pasa si es un botón de servidor? Por supuesto, también puede agregar el atributo onclick del botón del servidor en segundo plano.
Código de front-endthird.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="third.aspx.cs" Inherits="third" %>
<html>
<cabeza>
<título>Página sin título</título>
</cabeza>
<cuerpo>
<form id="form1" runat="servidor">
<div>
<seleccione id="Seleccionar1">
<opción seleccionada="valor seleccionado"=1>Discípulo del ratón</opción>
<valor de opción=2>Maestro Wu Qiwa</opción>
</seleccionar>
<asp:Button ID="Botón1" runat="servidor" Text="Este es un botón de servidor" /></div>
<div id="div1" />
<tipo de script="texto/javascript">
funciónRe(ret)
{
document.getElementById("div1").innerHTML = ret;
alerta(ret);
}
</guión>
</formulario>
</cuerpo>
</html>
Código detrás:
usando Sistema;
usando System.Data;
usando System.Configuration;
usando System.Collections;
usando System.Web;
utilizando System.Web.Security;
utilizando System.Web.UI;
usando System.Web.UI.WebControls;
usando System.Web.UI.WebControls.WebParts;
usando System.Web.UI.HtmlControls;
tercera clase pública parcial: System.Web.UI.Page,System.Web.UI.ICallbackEventHandler
{
Page_Load vacío protegido (remitente del objeto, EventArgs e)
{
//El cuarto parámetro es nulo, porque ya no puede pasarle parámetros en js string str = Page.ClientScript.GetCallbackEventReference(this,"document.getElementById('Select1')._
opciones[document.getElementById('Select1').selectedIndex].text","Re",null);
//return false es para evitar que se envíe el formulario. Button1.Attributes.Add("onclick",str+";return false;");
}
#region Miembros de ICallbackEventHandler
cadena pública RaiseCallbackEvent (cadena eventArgument)
{
if (eventArgument == "Aprendiz de ratón")
{
return "Aprendiz de ratón: La vida es como un ratón. ¡Si no estás en el granero, estás en el baño!";
}
demás
{
volver "Maestro Wu Qiwa: confiado, autosuficiente, optimista";
}
}
#regiónfinal
}
Un pequeño consejo: después de terminar de escribir System.Web.UI.ICallbackEventHandler, mueva el mouse hacia arriba y habrá un pequeño gráfico frente a System. Haga clic en él para escribir automáticamente el código RaiseCallbackEvent.
¡El tercero se siente peor!