使用回调的步骤如下:
- 在控件或者page类中实现 ICallbackEventHandler 接口,分别是 RaiseCallbackEvent() 和 GetCallbackResult() 。RaiseCallbackEvent()是回调执行的方法,该方法处理回调的内容。他没有返回值,而是从浏览器接受一个字符串作为事件的参数,即接受客户端 javaScript 传递的参数。它是首先触发的,接下来触发的就是 GetCallbackResult() ,他将得到的结果返回给客户端的脚本。
- 生成调用该回调的客户端脚本。可通过 ClientScriptManager 类得 GetCallbackEventReference() 生成。 Page类得 ClientScript 属性就是一个 ClientScriptManager 类得实例。
- 编写代码调用在第二步中生成的客户端脚本。
下面是两个例子:
①由用户触发
在页面中添加
<body>
<form id="a1" runat=server>
<div>
<input id="txtUserName" type="text" />
<input id="btnCallBack" type="button" value="callBack" onclick="<%= ClientScript.GetCallbackEventReference(this,"document.getElementById('txtUserName').value","onCallBack",null) %>" />
</div>
</form>
<p id="result">
</p>
<div>
<input id="btnJTest" type="button" value="button" />
</div>
</body>
- 在button的 onclick 中写入:
onclick="<%= ClientScript.GetCallbackEventReference(this,"document.getElementById('txtUserName').value","onCallBack",null) %>" - 在javascript中编写相应的函数
function onCallBackNoBtn()
{
callServer(document.getElementById('txtUserName').value,"");
} - 在 xxx.aspx.cs 中继承 ICallbackEventHandler 并实现其方法。
public partial class webPage_callBackBtn : System.Web.UI.Page, ICallbackEventHandler
{
protected string strUserInfo; //callback最终得到的信息
protected void Page_Load(object sender, EventArgs e)
{
}
#region ICallbackEventHandler 成员
public string GetCallbackResult()
{
return strUserInfo;
}
public void RaiseCallbackEvent(string eventArgument) //服务端的处理函数
{
if (eventArgument == "") return;
System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection();
conn.ConnectionString = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["nowthWindConnectionString"].ConnectionString;
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.Text;
cmd.Parameters.Add("@FirstName", SqlDbType.NVarChar, 10)
.Value = eventArgument;
cmd.CommandText = "SELECT EmployeeID, LastName FROM Employees WHERE FirstName=@FirstName";
cmd.Connection = conn;
SqlDataReader reader;
ConnectionState previousConnectionState = conn.State;
try
{
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
reader = cmd.ExecuteReader();
using (reader)
{
while (reader.Read())
{
// Process SprocResults datareader here.
strUserInfo += reader[0];
}
}
strUserInfo += "###";
}
finally
{
if (previousConnectionState == ConnectionState.Closed)
{
conn.Close();
}
}
}
#endregion
}
RaiseCallbackEvent() 负责接收 client 端的javascript 所传送过来的参数,以此参数查询数据库中的数据,最后由 GetCallbackResult() 将结果传回 client端的javascript,最后将结果显示出来。 - 完成 O(∩_∩)O~ 现在在 textbox 中输入 Nancy 则会显示 1### 。如果输入的名字在数据库中没有则不显示,(我的只是完成了《圣殿祭司的asp.net》中的这一节的一部分)
②自动触发。
- 如上 3. 在 xxx.aspx.cs 中继承 ICallbackEventHandler 并实现其方法。
- 在 javascript中添加
<script type="text/javascript">
function doSearch(){
var txtFirstName= document.getElementById("txtUserName");
callServer(txtFirstName.value,"");
}
function receiveServerData(txtUserInfo)
{
Results.innerText=txtUserInfo;
}
var int=self.setInterval('doSearch()',5000);
</script> - 在 aspx.cs 中动态注册 javascript
protected void Page_Load(object sender, EventArgs e)
{
string cbReference = Page.ClientScript.GetCallbackEventReference(this,"arg", "receiveServerData", null);
//Page.ClientScript.GetCallbackEventReference(this,"arg", "receiveServerData", null);
string callBackScript;
callBackScript = "function callServer(arg,context){" + cbReference + "};";
//string callBackScript = "function callServer(arg,context){WebForm_DoCallback('__Page',arg,receiveServerData,null,null,false)};";
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "CallServer123", callBackScript, true);
} - 完成