Asp.Net2.0无刷新客户端回调

xiaoxiao2021-03-01  18

Asp.Net2.0无刷新客户端回调(笔记)

 

按照  一帆(老鼠粮仓之路) 的文章,在2005正式版,有些不能实现,譬如方法RaiseCallbackEvent(string arg)的返回类型在vs2005中为void,而不算beta版中的string。

所以代码有些修改,记录如下:首先说一下:Page.ClientScript        //Page.ClientScript        //获取用于管理脚本、注册脚本和向页添加脚本的 System.Web.UI.ClientScriptManager 对象。        //返回结果:        //     一个 System.Web.UI.ClientScriptManager 对象。ClientScriptManager对象 是一些 在 Web 应用程序中定义用于管理客户端脚本的方法,其中有一个方法重载:GetCallbackEventReference(……):string GetCallbackEventReference(Control control, string argument, string clientCallback, string context)获取一个对客户端函数的引用;调用该函数时,将启动一个对服务器端事件的客户端回调。此重载方法的客户端函数包含指定的控件、参数、客户端脚本和上下文。参数::            control: 处理客户端回调的服务器 System.Web.UI.Control。该控件必须实现                        System.Web.UI.ICallbackEventHandler接口并提供                        System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent(System.String)方法            argument: 从客户端脚本传递给服务器端的一个参数                            System.Web.UI.ICallbackEventHandler.RaiseCallbackEvent(System.String)方法            clientCallback: 一个客户端事件处理程序的名称,该处理程序接收成功的服务器端事件的结果。            context: 启动回调之前在客户端计算的客户端脚本。脚本的结果传回客户端事件处理程序。//具体什么意思还是不太清楚 返回结果:    调用客户端回调的客户端函数的名称。GetCallbackEventRefernce发送到了客户端的代码是这样的:                 WebForm_DoCallback('__Page',message,ShowServerTime,context,null,false) message:argShowServerTime:ReceiveServerData三种客户端回调方法:第一种:添加 ServerTime.aspx 页面前台代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ServerTime.aspx.cs" Inherits="_3_ServerTime" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" ><head runat="server">    <title>服务器时间</title>     <script language="javascript" type="text/javascript">          function GetServerTime()          {             var message = '';             var context = '';                         <%=sCallBackFunctionInvocation%>          }                   function ShowServerTime(timeMessage, context)          {             alert('现在服务器上的时间是:\n' + timeMessage);          }      </script> </head><body>    <form id="form1" runat="server">      <input type="button" value="得到服务器端时间" οnclick="GetServerTime();" />     </form></body></html>

 

using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;

public partial class _3_ServerTime : System.Web.UI.Page, ICallbackEventHandler     //System.Web.UI.ICallbackEventHandler//一定要实现ICallbackEventHandler接口,用于指示控件可以作为服务器的回调事件的目标。{    public string sCallBackFunctionInvocation;

    protected void Page_Load(object sender, EventArgs e)    {        sCallBackFunctionInvocation =                        Page.ClientScript.GetCallbackEventReference(this, "message", "ShowServerTime", "context");        //因为它会返回个ClientScriptManager, ClientScriptManager管理所有的客户端脚本。        //然后在前台某个按钮的onclick事件里<%=那个public后台字符串% >.        //此方法 发送到客户端代码是:WebForm_DoCallback('__Page',message,ShowServerTime,context,null,false)     }

    public void RaiseCallbackEvent(string eventArgument)    {        //  ICallbackEventHandler接口 要实现的方法        //     处理以控件为目标的回调事件。        // 参数:        //   eventArgument:        //     一个字符串,表示要传递到事件处理程序的事件参数。    }

    public string GetCallbackResult()    {        //  ICallbackEventHandler接口 要实现的方法        //     返回以控件为目标的回调事件的结果。        //        // 返回结果:        //     回调的结果。        return DateTime.Now.ToString();    }}

第二种方法:在上面的方法中我们必须要在前台绑定后台,那么如果不绑定呢?我们怎么做:直接把GetCallbackEventReference当做js函数中的一个实现内容,然后把这个js函数注册到客户端。新建页面TestPage.aspx前台代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="TestPage.aspx.cs" Inherits="_3_TestPage" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" ><head runat="server">    <title>无标题页</title>    <script type="text/javascript">        function test()        {            var lb = document.getElementById("Select1");            //取的那个下拉框            var con = lb.options[lb.selectedIndex].text;            //得到你选择的下拉框的文本再调用呢个CallTheServer,是一个由服务器端输出的js函数            CallTheServer(con,'');  //此方法由 后台生成到前台来        }        function ReceiveServerData(rValue)        {            Results.innerHTML = rValue;            //在<span id="Results"></span>添加由后台生成的方法 CallTheServer(con,'');        }    </script>

</head><body>    <form id="form1" runat="server">    <div>        <select id="Select1">            <option value='1' selected="selected">老鼠徒弟</option>            <option value='2'>吴旗娃师傅</option>        </select>        <br />        <br />        <input οnclick="test()" value="从服务器返回下拉框文本" type='button'/>        <br />        <br />        <span id="Results"></span>        <br />    </div>    </form></body></html>

后台代码:

using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;

public partial class _3_TestPage : System.Web.UI.Page,System.Web.UI.ICallbackEventHandler{    protected void Page_Load(object sender, EventArgs e)    {        String cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context");        String callbackScript;        callbackScript = "function CallTheServer(arg,context)" +         "{ " + cbReference + "} ;";        Page.ClientScript.RegisterStartupScript(this.GetType(), "abcdefg", callbackScript, true);        //第四个参数代表是不是要自动给着脚本加上<script type="text/javascript"></script>标记,当然要加啊

    }

    private string SelectValue;    public void RaiseCallbackEvent(string eventArgument)    {        //  ICallbackEventHandler接口 要实现的方法        //     处理以控件为目标的回调事件。        // 参数:        //   eventArgument:        //     一个字符串,表示要传递到事件处理程序的事件参数。        SelectValue = eventArgument;    }

    public string GetCallbackResult()    {        //  ICallbackEventHandler接口 要实现的方法        //     返回以控件为目标的回调事件的结果。        //        // 返回结果:        //     回调的结果。        return "你选择的是:" + SelectValue;    }}

第三种:前面两种都是<input type="button"的html控件,那么如果是WEB按钮控件呢?当然也可以,在后台添加服务器按钮的onclick 属性。新建 third.aspx 页面前台代码:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="third.aspx.cs" Inherits="_3_third" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" ><head runat="server">    <title>无标题页</title></head><body>    <form id="form1" runat="server">    <div>        <select id="Select1">            <option selected="selected" value='1'>老鼠徒弟</option>            <option value='2'>吴旗娃师傅</option>        </select>        <asp:Button ID="Button1" runat="server" Text="这是个服务器按钮" />    </div>        <div id="div1" />        <script type="text/javascript">            function Re(ret)            {               document.getElementById("div1").innerHTML = ret;               alert(ret);            }    </script>    </form></body></html>

后台代码:

using System;using System.Data;using System.Configuration;using System.Collections;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.WebControls;using System.Web.UI.WebControls.WebParts;using System.Web.UI.HtmlControls;

public partial class _3_third : System.Web.UI.Page,System.Web.UI.ICallbackEventHandler{    protected void Page_Load(object sender, EventArgs e)    {        //第四个参数为null,因为你不可能再在js中给他传参数了        string str = Page.ClientScript.GetCallbackEventReference(this,             "document.getElementById('Select1').options[document.getElementById('Select1').selectedIndex].text",            "Re", null);        //return false是为了防止提交窗体        Button1.Attributes.Add("onclick", str + ";return false;");    }

    private string SelectValue;    public void RaiseCallbackEvent(string eventArgument)    {        //  ICallbackEventHandler接口 要实现的方法        //     处理以控件为目标的回调事件。        // 参数:        //   eventArgument:        //     一个字符串,表示要传递到事件处理程序的事件参数。        if (eventArgument == "老鼠徒弟")        {            SelectValue = "老鼠徒弟:人生如鼠,不在仓就在厕!";        }        else        {            SelectValue = "吴旗娃师傅:自信自强,乐观向上";        }    }

    public string GetCallbackResult()    {        //  ICallbackEventHandler接口 要实现的方法        //     返回以控件为目标的回调事件的结果。        //        // 返回结果:        //     回调的结果。        return  SelectValue;    }}

小技巧,当你写完System.Web.UI.ICallbackEventHandler后,把鼠标移上去,那么System前面'S'下面会有个小红线,点他会自动写好那个RaiseCallbackEvent代码。

 

原文: http://anan.cnblogs.com/articles/340445.html

后台代码: 相关资源:微信小程序源码-合集1.rar
转载请注明原文地址: https://www.6miu.com/read-3450312.html

最新回复(0)