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无刷获得数据的功能。

posted @ 2010-08-21 22:29  dongfp  阅读(393)  评论(1)    收藏  举报