浅谈ASP.NET客户端回调

最近同学要做一个项目,需求是:音乐播放器。大致UI如图:

点击右边的“X”图标,可以删除当前选定的这首歌。因为现实界面的代码是复制过来的,并且前辈使用的是拼接字符串,然后绑定到页面的。没有使用ASP.NET服务器控件,所以要做点击图标,然后删除的事件,与我们平时开发有所不同了。我觉得有3中方案可以解决这个问题。

1.最坏的办法,把这个UI界面使用GridView呈现,GridView是服务器控件,所以最后一列可以是ImageButton,然后就有了服务器控件事件。解决起来就是,之前的原生态的HTML代码都删除掉,然后重新写代码。同学自己就是用的这种方式,这种方法便于理解,容易修改出来。

2.使用AJAX+Handler,就是用Ajax调用一个asp.net handler处理,handler处理的好处是,结构和代码进行了分离,这种方式也是容易接受。

3.使用ASP.NET自身的回调函数。具体参考:客户端回调实现 (C#) 示例  http://msdn.microsoft.com/zh-cn/library/ms178210.aspx 。

     在MSDN实例中,客户端回调给出了一个解决方案:项目中需要在客户端使用JavaScr操作后台的C#代码,然后它底层实现这些原理,而这些原理都封装好了,我们按照它提供的接口和结构去实现就好了。

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Client Callback Demo</title>
    <script type="text/javascript">
        function deleteIt(_this) {
            var item = _this.parentNode.parentNode.firstChild.innerText;
            //alert(item);
            //alert("确定删除第 "+item+" 条记录吗?");
            CallServer(item,"");
        }
        function ReceiveServerData(rValue) {
            //document.getElementById("ResultSpan").innerHTML = rValue;
            alert(rValue + "页面重新加载中");
            //将页面刷新,重新读取数据库数据
            window.location.href = window.location.href
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <%= result%>
    </div>
    </form>
</body>
</html>
result是后台生成的HTML代码段。
后台实例代码:
public partial class 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");
            //回调的JavaScript
            String callbackScript;
            callbackScript = "function CallServer(arg,context)"+
                "{"+cbReference+";}";
            //向页面添加javas代码段
            Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "CallServer", callbackScript, true);
            BindData();
        }
        protected string returnValue;
        public String result = "<table>";
        private void BindData()
        {
            DataTable mytable=new DataTable();
            mytable=GenerateData();
            for(int i=0;i<mytable.Rows.Count;i++)
            {
                //第i行第0列的值
                //result = mytable.Rows[i][0].ToString();
                
                result += "<tr><td>" + mytable.Rows[i][0].ToString() + "</td>";
                result += "<td>" + mytable.Rows[i][1].ToString() + "</td>";
                result += "<td>" + mytable.Rows[i][2].ToString() + "</td>";
                result += "<td>" + mytable.Rows[i][3].ToString() + "</td>";
                result += "<td><input type='button' onclick='deleteIt(this);' value='Delete'/></td></tr>";
            }
            result += "</table>";
        }
        //Generate the data in memory.
        protected DataTable GenerateData()
        {
……
        }
        public void RaiseCallbackEvent(String eventArgument)
        {
            //实际情况上执行数据库删除操作,此处为了演示直接返回一个字符串。
            returnValue="删除第"+eventArgument+"记录成功!";
        }

        public string GetCallbackResult()
        {
            return returnValue;
        }
   }
RaiseCallbackEvent(String eventArgumnet)和GetCallbackResult()方法是实现ICallbackEventHandler接口。 、

通过这中方法,可以完成客户端和服务器端之间的交互。当然这个实例中,页面最后还是要重新刷新的,以便重新render页面。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Golang语言社区

【Golang语言社区投稿】golang高并发基于协程,通道的任务池

要点: 封装了协程模型基于select模型的通道传递; 支持同步和异步添加任务;由于golang无函数指针,任务函数利用了go 反射机制支持可变参的入参 开发者...

55311
来自专栏跟着阿笨一起玩NET

ASP.NET用HttpListener实现文件断点续传

本文转载:http://www.cnblogs.com/TianFang/archive/2007/01/03/610739.html

1031
来自专栏大内老A

如何实现对上下文(Context)数据的统一管理 [提供源代码下载]

在应用开发中,我们经常需要设置一些上下文(Context)信息,这些上下文信息一般基于当前的会话(Session),比如当前登录用户的个人信息;或者基于当前方法...

4876
来自专栏Porschev[钟慰]的专栏

C# AD(Active Directory)域信息同步,组织单位、用户等信息查询

接上篇 Windows Server 2008 R2 配置AD(Active Directory)域控制器 对AD域结合常见需求用C#进行一些读取信息的操作...

4485
来自专栏GreenLeaves

WCF系列教程之WCF客户端调用服务

1、创建WCF客户端应用程序需要执行下列步骤 (1)、获取服务终结点的服务协定、绑定以及地址信息 (2)、使用该信息创建WCF客户端 (3)、调用操作 (4)、...

2289
来自专栏林德熙的博客

win10 uwp 网络编程 带Header的WebRequest获取BufferHttpClient 使用 Cookie

上面传输的头,Head=Head+length 中的第二个Head,包含 传输者id,当前传输是传输的消息最后一段还是中间,当前传输 是服务器第消息

1081
来自专栏王清培的专栏

Redis 数据结构与内存管理策略(下)

Redis 数据结构与内存管理策略(下) 标签: Redis Redis数据结构 Redis内存管理策略 Redis数据类型 Redis类型映射 作者:王清培...

3258
来自专栏逸鹏说道

Python3 与 C# 并发编程之~ 上篇

其实逆天现在Coding已经是80%变成Python了,20%才是Net,也不确定是否一直在Net界干下去,所以只能尽可能的在说新知识的同时,尽量把脑子里面Ne...

1284
来自专栏烙馅饼喽的技术分享

我的CMS开发记-5 实现静态化页

      为了实现静态化页,我在博客园里可是搜了半天。最后找到两个方案:  http://www.cnblogs.com/hsqzzzl/archive/20...

36010
来自专栏c#开发者

如何给DataGrid添加自动增长列

如何给DataGrid添加自动增长列 我想我们都知道在数据库中如何添加自增长列,我们可以将这个自增长列绑定到DataGrid上使得用户方便的知道现在是第几行,今...

43410

扫码关注云+社区

领取腾讯云代金券