O retorno de chamada do cliente do Asp.Net2.0 é um método muito interessante. Ele nos permite controlar quais dados enviar ao servidor sem enviar a página inteira. . página inteira.
Em primeiro lugar, temos que falar sobre um método muito importante: GetCallbackEventRefernce. Anotei meu entendimento. Pode estar errado.
GetCallbackEventReference primeiro implementa o método RaiseCallbackEvent que permite que o script do cliente passe parâmetros para o servidor e, em seguida, retorne o valor do método RaiseCallBackEvent para um parâmetro que você registrou no método GetCallbackEventRefernce (na verdade, também é um script que você deseja escrever no cliente ). Para chamar GetCallbackEventRefernce, você deve passar dois parâmetros do script do cliente, um é o valor a ser passado para o evento RaiseCallbackEvent e o outro é o contexto.
O significado de seus parâmetros é o seguinte:
Primeiro: a página ou controle do servidor que. implementa a interface ICallbackEventHandler. Escreva isso para representar a página anterior.
O segundo: representa o valor que você deseja passar do cliente para o método RaiseCallbackEvent do servidor.
O terceiro: uma função js que você deseja escrever no cliente. Ao mesmo tempo, o servidor também passará os dados calculados para esta função. parâmetros desta função.
Quarto: não sei exatamente o que significa contexto. O código que GetCallbackEventRefernce envia ao cliente é o seguinte:
WebForm_DoCallback('__Page',arg,ReceiveServerData,context,null,false)
Então, o que devemos fazer para obter a solicitação de o cliente? Como ligar para ele? Eu vi três métodos:
O primeiro: escrever uma string pública em segundo plano e atribuí-la em Page_Load: =Page.ClientScript.GetCallbackEventReference(this, "message", "ShowServerTime", "context"); .ClientScrip, pois retornará um ClientScriptManager, que gerencia todos os scripts do cliente. Então, no evento onclick de um botão em primeiro plano <%=that public background string%> Faça um pequeno código experimental como segue:
Frontend ServerTime.aspx: Por conveniência, remova muitos html inúteis
<%@ page language=". C#" CodeFile="ServerTime.aspx.cs" Inherits="ServerTime_aspx" %>
<html>
<cabeça>
<título>Hora do servidor</título>
<script linguagem="javascript">
função GetServerTime()
{
var mensagem = '';
var contexto = '';
<%=sCallBackFunctionInvocation%>
}
function ShowServerTime(timeMessage, contexto) {
alert('A hora atual no servidor é:n' + timeMessage);
}
</roteiro>
</cabeça>
<corpo>
<form id="MainForm" runat="servidor">
<input type="button" value="Obter horário do servidor" onclick="GetServerTime();"
</formulário>
</corpo>
</html>
Backend:
usando Sistema;
usando System.Web.UI;
classe parcial pública ServerTime_aspx: Page, ICallbackEventHandler
{
//Certifique-se de implementar a desculpa ICallbackEventHandler public string sCallBackFunctionInvocation;
void Page_Load(object sender, System.EventArgs e)
{
sCallBackFunctionInvocation = Page.ClientScript.GetCallbackEventReference(this, "mensagem", "ShowServerTime", "contexto");
}
string pública RaiseCallbackEvent(string eventArgument)
{
retornar DateTime.Now.ToString();
}
}
Execute, clique no botão e o resultado será o seguinte:
Segundo método: No método acima, devemos vincular o plano de fundo ao primeiro plano, e se não o vincularmos? Fazemos isso:
usamos GetCallbackEventReference diretamente como conteúdo de implementação na função js e, em seguida, registramos essa função js no cliente.
Código TestPage de front-end:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="TestPage.aspx.cs" Inherits="TestPage" %>
<html>
<cabeça>
<title>Página sem título</title>
<script type="texto/javascript">
teste de função()
{
var lb = document.getElementById("Select1");
//A caixa suspensa a ser obtida var con = lb.options[lb.selectedIndex].text;
//Obtenha o texto da caixa suspensa que você selecionou e então chame CallTheServer, que é uma função js gerada pelo servidor CallTheServer(con,'');
}
funçãoReceiveServerData(rValue)
{
Resultados.innerHTML = rValor;
}
</roteiro>
</cabeça>
<corpo>
<form id="form1" runat="servidor">
<div>
<selecione id="Selecionar1">
<valor da opção=1 selecionado="selecionado">Discípulo do Mouse</opção>
<valor da opção=2>Mestre Wu Qiwa</opção>
</selecionar>
<br />
<br />
<input onclick="test()" value="Retornar o texto da caixa suspensa do servidor" type=button>
<br />
<br />
<span ID="Resultados"></span>
<br />
</div>
</formulário>
</corpo>
</html>
Código de back-end:
usando System;
usando System.Data;
usando System.Configuration;
usando System.Collections;
usando System.Web;
usando System.Web.Security;
usando System.Web.UI;
usando System.Web.UI.WebControls;
usando System.Web.UI.WebControls.WebParts;
usando System.Web.UI.HtmlControls;
classe parcial pública TestPage: System.Web.UI.Page,System.Web.UI.ICallbackEventHandler
{
protegido void Page_Load (remetente do objeto, EventArgs e)
{
String cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "contexto");
String callbackScript;
callbackScript = "função CallTheServer(arg,context)" +"{ " + cbReference + "} ;";
Page.ClientScript.RegisterStartupScript(this.GetType(),"abcdefg",callbackScript, true);
//O quarto parâmetro representa se a tag <script type="text/javascript"></script> deve ser adicionada automaticamente ao script, é claro que ela deve ser adicionada}
String pública RaiseCallbackEvent(String eventArgument)
{
return "O que você selecionou é" + eventArgument;
}
}
A seguir está o resultado da execução:
O terceiro tipo: Os dois primeiros são controles HTML com <input type="button", e se for um botão de servidor? Claro, você também pode adicionar o atributo onclick do botão do servidor em segundo plano.
Código front-end third.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="third.aspx.cs" Inherits="third" %>
<html>
<cabeça>
<title>Página sem título</title>
</cabeça>
<corpo>
<form id="form1" runat="servidor">
<div>
<selecione id="Selecionar1">
<opção selecionada="valor selecionado"=1>Discípulo do Mouse</opção>
<valor da opção=2>Mestre Wu Qiwa</opção>
</selecionar>
<asp:Button ID="Button1" runat="server" Text="Este é um botão de servidor" /></div>
<div id="div1" />
<script type="texto/javascript">
funçãoRe(ret)
{
document.getElementById("div1").innerHTML = ret;
alerta(ret);
}
</roteiro>
</formulário>
</corpo>
</html>
Código por trás:
usando o sistema;
usando System.Data;
usando System.Configuration;
usando System.Collections;
usando System.Web;
usando System.Web.Security;
usando System.Web.UI;
usando System.Web.UI.WebControls;
usando System.Web.UI.WebControls.WebParts;
usando System.Web.UI.HtmlControls;
terceira classe pública parcial: System.Web.UI.Page,System.Web.UI.ICallbackEventHandler
{
protegido void Page_Load (remetente do objeto, EventArgs e)
{
//O quarto parâmetro é nulo, porque você não pode mais passar parâmetros para ele em js string str = Page.ClientScript.GetCallbackEventReference(this,"document.getElementById('Select1')._
opções[document.getElementById('Select1').selectedIndex].text","Re",null);
//return false é para evitar que o formulário seja enviado. Button1.Attributes.Add("onclick",str+";return false;");
}
#region Membros do ICallbackEventHandler
string pública RaiseCallbackEvent(string eventArgument)
{
if (eventArgument == "Aprendiz de Mouse")
{
return "Aprendiz de rato: A vida é como um rato. Se você não está no celeiro, está no banheiro!";
}
outro
{
retornar “Mestre Wu Qiwa: confiante, autossuficiente, otimista”;
}
}
#endregion
}
Uma pequena dica, depois de terminar de escrever System.Web.UI.ICallbackEventHandler, mova o mouse para cima e haverá um pequeno gráfico na frente de System. Clique nele para escrever automaticamente o código RaiseCallbackEvent.
O terceiro parece o pior!