ASP.NET客户端回调
在asp.net 3.5实现页面无刷新效果非常容易,使用ScriptManager等服务器控件。本文介绍另一种不使用这些控件实现同样的效果的方法。叫做客户端回调。下面介绍三个重要方法
一.使用Page.ClientScript.RegisterClientScriptBlock;
RegisterClientScriptBlock方法可以把JavaScript函数放在页面的顶部。其用法如下:
<div>
<input id="Button2" type="button" onclick="AlerHelloWord()" value="button" />
</div>
C#
protected void Page_Load(object sender, EventArgs e)
{
string myScript = @"function AlerHelloWord(){alert('hell word');}";
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "myScript", myScript, true);
}
下面点击按钮远行,弹出提示框;
在这个例子中,把类型指定为this.GetType(),还指定了键,要包含的脚本,以及一个设置为true的Boolen值,这样.Net就自动把脚本放在ASP.NET页面上的<script>标记中。
二.使用Page.ClientScript.RegisterStartupScript
RegisterStartupScript方法与RegisterClientScriptBlock方法的区别不大。最大的区别在于RegisterStartupScript把脚本放在页面的底部,而不是在顶部。那么这两种方法在页面上注册脚本的过程有什么区别?如果页面上有些处理控件的javaScript,在大多数情况下应使用RegisterStartupScript方法。原因是如果页面上有一个文本框值为“hello asp.net”,然后有以下事件:
protected void Page_Load(object sender, EventArgs e)
{
string myScript = @"alert(document.forms[0].TextBox1.value);";
Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "myScript", myScript, true);
}
这样将会出错。原因是javaScript函数在文本框被放置之前就触发。如果使用RegisterStartupScript方法就可避免这个错误。
三.使用用Page.ClientScript.RegisterClientScriptInclude
使用该方法可以在页面上注册脚本文件
String script=”myJavaScript.js”;
Page.ClientScript.RegisterClientScriptInclude(“scriptKey”,scripot);会在页面上创建如下代码:<scripot src=” myJavaScript.js” type=”text/javascript”><script>
下面使用以上方法实现一个简单的带参数的回调功能:在页面上用户输入一个邮政编码,然后使用回调功能在服务器上实例一个XML Web服务请求,返回最新的天气信息。
<head runat="server">
<title></title>
<script>
function GetTemp() {
var zipCode = document.forms[0].Text1.value;
UseCallback(zipCode);
}
function GetTempFromServer(text2) {
document.forms[0].Text2.value="ZipCode"+text2;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:TextBox ID="Text1" runat="server"></asp:TextBox><br />
<input type="button" value="单击" onclick="GetTemp()" /><br />
<asp:TextBox ID="Text2" runat="server"></asp:TextBox>
</div>
</form>
</body>
注意中间那个按钮不是服务器控件。后台代码如下:
public partial class Default2 : System.Web.UI.Page,ICallbackEventHandler { private string _callbackResult = null; protected void Page_Load(object sender, EventArgs e) { string cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "GetTempFromServer", "context"); string cbScript = "function UseCallback(arg,cotext){" + cbReference + ";}"; Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "", cbScript, true); } #region ICallbackEventHandler 成员 public string GetCallbackResult() { return _callbackResult; } public void RaiseCallbackEvent(string eventArg) { Weather.TemperatureServer ws=new Weather.TemperatureServer(); _callbackResult = ws.GetTemp(eventArg).ToString(); } #endregion }
客户端上用于实现回调功能的函数是UseCallback(),然后使用Page.ClientScript.RegisterClientScriptBlock把这个字符串填充到页面上,实现了ICallbackEventHandler接口的两个方法用于接受参数和返回结果。最后,页面在刷新内容时并不刷新整个页面,这里的回调功能使用了XmlHTTP,所以客户端必须支持XmlHTTP,为此.net framework2.0和3.5引入了SupportsCallBack和SupportsXmlHTTP属性。可以在生成页面时检查
if(Page.Requst.BrowerSupportsXmlHTTP==true){}
本篇到此为止,下一篇将介绍使用回调实现GridView无刷获得数据的功能。