动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
   .Net → 阅读文章

 ASP.NET编程入门随想之信客

作者来源: 
阅读 1304 人次 , 2006-4-26 9:46:00 

记得早年在乡间,对外的通信往来主要依靠一种特殊职业的人:信客。外出谋生的人多了,少不了要带几封平安家信、捎一点衣物食品的,那就用得着信客了。信客要有一点文化,知道各大码头的情形,还要一副强健的筋骨,背得动重重的行李。信客沉重的脚步,是乡村和城市的纽带。
                        -- 余秋雨《文化苦旅·信客》


  ■ 一个馒头引发的血案 - 回发与事件

  基于WEB的分布式系统中,用户往往是通过提交表单,浏览器产生相应的HTTP POST请求来完成交互过程,这个过程称为回发(PostBack)。在同一个网页中,常会有许多HTML标签可能引起回发,申请交于服务器处理。

ASP.NET编程入门随想之信客(图一)

  控件对应着客户端的HTML标签,有着自己的状态和行为。用户操作引起每一次回发,会调用页面中一个或多个控件行为修改其状态,也就是说,杯中的粉圆(《随想十》中对控件的比喻)之间是有关联的,用户拨动其中一个,可能引起其它粉圆震动。拓展开来,当用户操作或系统内部引发状态改变时,类需要发送一个消息给关联类,让关联类做相应的状态调整。在.NET框架中,这个消息被称为事件(event),发接消息的类被称为事件源(event source),关联类被称为事件接收者(event sink)。回发的处理过程,实质上是事件源调用事件接收者的行为函数,称为回调(callback)。

  我们不希望在编译时就确定回调的对象,否则这种强耦合关系就意味着每次使用时需要拎一串关联粉圆放到杯子中。相反,我们希望到运行时再来确定回调关系,在.NET框架中,这种方式被定义成委托(delegate),我们在《随想七》和《随想八》已经对其有了初步的认识。事件基于发布-订阅机制,每一个产生事件的类都有一个委托成员(发布机制),在系统初始化时,接收器或其它类需要将具体的事件处理程序绑定到委托成员(订阅机制),运行时,系统自动完成回调。

  ■ 口信 -用户操作引发的服务器端事件

  "终于有妇女来给信客说悄悄话:'关照他,往后带东西几次并一次,不要鸡零狗碎的';'你给他说说,那些货色不能在上海存存?我一个女人家,来强盗来贼怎麽办'……信客沉稳地点点头。"

  用户会对客户端浏览器中的页面元素做出各种操作,浏览器可以通过JavaSript之类的脚本语言来捕获这些操作并且做出相应回应,但对服务器而言,它却常常视而不见。要产生服务器端事件,就必须在设计期让事件源对应的表单元素引发带有鲜明特征的回发,从而让页面能够正确识别,并传递给控件以做相应回调,完成用户操作到事件的映射过程。

  ASP.NET用接口IPostBackEventHandler做为信客的口信,带回远方的消息,它包含一个方法:RaisePostBackEvent。在回传后,页面会在控件树中寻找与引发回传HTML元素的UniqueID相匹配的控件,并调用该方法,下例为依赖于用户点击引发事件的自定义控件范例。

// MyControls.cs 自定义控件集
using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace essay
{
 public class myButton:WebControl,IPostBackEventHandler
 {
  //定义控件属性Text
  public virtual string Text
  {
   get
   {
    string s =(string)ViewState["Text"];
    return (s==null)?string.Empty:s;
   }
   set {ViewState["Text"]=value;}
  }
  //生成控件对应的HTML代码
  protected override void Render(HtmlTextWriter writer)
  {
   writer.Write("<INPUT TYPE=submit name=" + this.UniqueID + " Value='"+this.Text+"' />");
  }
  //定义Click事件委托
  public event EventHandler Click;
  //把客户端提交映射到自定义的Click事件
  void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
  { OnClick(EventArgs.Empty); }
  //实现回调
  protected virtual void OnClick(EventArgs e)
  { if(Click!=null)Click(this,e); }
 }
}
  
 本文TagsC#  
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:在ASP.NET Atlas中创建自定义Behavior
· 下一篇:用VS2005实现ASP.NET2.0移动开发
· .NET之ASP Web Application快速入门(4)
· 将上传图片打上防伪图片水印并写入数据库
· 从 Visual Basic 6.0 到 Visual Basic.NET 的转换(3)
· 利用关联将子关联记录取出
· 如何用MAPI和CDONTS来发邮件


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077