Share

前面讲到了视图和控件状态,ASP.NET中有个概念叫做回传,因为ASP.NET框架是围绕Web表单构建的,回传即信息从客户端浏览器传递到服务器的过程。

那么这其中又分为2种情况:

当控件引起回传的时候,表单回传到服务器,会引发服务器控件,比如Button被单击时,Click事件则会再包含该Button的表单中回传给服务器,这也称为回传事件。

第2种情况则是,Web表单中的数据也可以传给控件。比如当表单包含TextBox时,表单中的数据会在Web表单提交到服务器时传递给TextBox,这个数据又称为回传数据。

下面分别说明这2种情况的实现

处理回传数据

这里主要使用到IPostBackDataHandler接口

namespace HandlePostBack
{
    //处理回传数据
    public class HandlePostDataControl:WebControl,IPostBackDataHandler
    {
        public event EventHandler TextChanged;
        public string Text
        {
            get
            {
                if (ViewState["Text"] == null)
                    return String.Empty;
                else
                    return (string)ViewState["Text"];
            }
            set
            {
                ViewState["Text"] = value;
            }
        }
        protected override void AddAttributesToRender(HtmlTextWriter writer)
        {
            writer.AddAttribute(HtmlTextWriterAttribute.Type, "text");
            writer.AddAttribute(HtmlTextWriterAttribute.Value, Text);
            writer.AddAttribute(HtmlTextWriterAttribute.Name, this.UniqueID);
            base.AddAttributesToRender(writer);
        }
        public bool LoadPostData(string postDataKey, System.Collections.Specialized.NameValueCollection postCollection)
        {
            if (postCollection[postDataKey] != Text)
            {
                Text = postCollection[postDataKey];
                return true;
            }
            return false;
        }
        protected override HtmlTextWriterTag TagKey
        {
            get
            {
                return HtmlTextWriterTag.Input;
            }
        }
        public void RaisePostDataChangedEvent()
        {
            if (TextChanged != null)
            {
                TextChanged(this, EventArgs.Empty);
            }
        }
    }
}

IPostBackDataHandler接口包括两个方法:LoadPostData用来检索从浏览器传回的表单域,其中第一个参数表示关联到当前控件的域的名字,RaisePostDataChangedEvent用来引发指示一个表单域值发生改变的事件,这里注意一点:如果表单域的名字与控件名字不匹配,则要实现上面的功能时,需要在控件的PreRender事件中调用Page.RegiseterRequiresPostBack(),通知页面这个控件有兴趣回收这个回传数据

上面的代码主要是让TextBox在页面回传中保存输入框的状态,并且在内容被修改后引发TextChanged事件,如果表单域的值和控件Text属性值不匹配,那么将更新Text属性并且返回True值,当LoadPostData返回True值时,就会执行RaisePostDataChangedEvent,一般都用这个方法实现一个事件。

处理回传事件

一次只能由一个控件引发表单提交至服务器的行为,同回传数据一样,其需要实现IPostBackEventHandler接口,这个接口包含了RaisePostBackEvent事件,用于控件引发回传时在服务器调用

namespace {
public class HandlePostEventControl : WebControl, IPostBackEventHandler
    {
        private string _Text;
        public string Text
        {
            get { return _Text; }
            set { _Text = value; }
        }
        public event EventHandler Click;
        protected override void AddAttributesToRender(HtmlTextWriter writer)
        {
            string eRef = Page.ClientScript.GetPostBackClientHyperlink(this, String.Empty);
            writer.AddAttribute(HtmlTextWriterAttribute.Href, eRef);
            base.AddAttributesToRender(writer);
        }
        protected override HtmlTextWriterTag TagKey
        {
            get
            {
                return HtmlTextWriterTag.A;
            }
        }
        protected override void RenderContents(HtmlTextWriter writer)
        {
            writer.Write(_Text);
        }
        public void RaisePostBackEvent(string eventArgument)
        {
           if(Click!=null)
           {
               Click(this, EventArgs.Empty);
           }
        }
    }
}

这段代码主要示例了如何实现IPostBackEventHandler接口,这个自定义控件类似于LinkButton,在浏览器中单击该控件生成的连接时,包含该控件的表单就会

回传给服务器并调用RaisePostBackEvent()

这里需要注意的是AddAttributesToRender()中第一行代码,GetPostBackClientHyperlink()用于返回浏览器中引起表单回传的JS,它返回类似下面的js代码

javascript:_doPostBack('HandlePostEventControl1','') ;_doPostBack()用于调用客户端表单的submit().

代码演示:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="TextPostBackControl.aspx.cs" Inherits="TextPostBackControl" %>
<%@ Register TagPrefix="handleps" Namespace="HandlePostBack"  %>
<!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>
         <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
         <asp:Label ID="Label2" runat="server" Text="Label" EnableViewState="false"></asp:Label>
        <handleps:HandlePostEventControl ID="HandlePostEventControl1" runat="server" Text="submit" OnClick="EventControl1_Click" />
    </div>
    </form>
</body>
</html>

后台代码:

 protected void EventControl1_Click(object sender, EventArgs e)
      {
        this.Label2.Text = HandlePostEventControl1.Text;
    }

当单击这个自定义的按钮时,Click事件会将TextBox中的值显示在Label中

本文参考了《ASP.NET 揭秘(卷2)》

转载于:https://www.cnblogs.com/626498301/archive/2010/08/03/1790929.html

自定义控件的构建(6)相关推荐

  1. 自定义控件的构建(12)

    Share 前面讲了模板的构建,我们忽略了一个细节,如果接触ASP.NET时间不长的话,一般都会看到数据表达式是<%#Eval('Name')%>这种形式的, 那么我们为什么用<%# ...

  2. 自定义控件的构建(10)

    Share 通过前面一系列的改进,我们已经可以初步构建出一个功能相对比较全面的控件了,那么,本篇关注一下我们一直忽略的地方,即如何在VS设计器中显示. 设计器体验 这主要有两种方式:控件设计时特性与关 ...

  3. 自定义控件的构建(5)

    Share 在ASP.NET框架中支持在回传中保存值的有2种方式:视图状态和控件状态 视图状态 ASP.NET中几个对象属性与控件最为密切的,就是ViewState了. 这里对其做下说明,任何可序列化 ...

  4. [转]决定何时使用 DataGrid、DataList 或 Repeater

    摘要:了解 ASP.NET 用于显示数据的三个控件: DataGrid.DataList 和 Repeater. 这些控件中的每一个都有独特的特性以及相关的优点和缺点. 创建显示数据的 ASP.NET ...

  5. Unity从零开始构建能力体系 Unity Ability System

    从零开始构建能力体系 你会学到什么 如何实施能力体系 如何使用用户界面工具包创建用户界面 如何使用Unity的GraphView API 如何实现保存系统 MP4 |视频:h264,1280×720 ...

  6. PropertyGrid自定义控件

    PropertyGrid是一个很强大的控件,使用该控件做属性设置面板的一个好处就是你只需要专注于代码而无需关注UI的呈现,PropertyGrid会默认根据变量类型选择合适的控件显示.但是这也带来了一 ...

  7. Android TV开发总结(三)构建一个TV app的焦点控制及遇到的坑

    原文:Android TV开发总结(三)构建一个TV app的焦点控制及遇到的坑 版权声明:我已委托"维权骑士"(rightknights.com)为我的文章进行维权行动.转载务必 ...

  8. XamarinForms教程构建XamarinForms开发环境

    构建XamarinForms开发环境 所谓Xamarin.Forms的开发环境,就是指在基本硬件和数字软件的基础上,为支持系统软件和应用软件的工程化开发和维护而使用的一组软件,简称SDE.对于任何的程 ...

  9. 教你如何 构建基本的用户控件

    创建一个简单用户控件是开始自定义控件的好方法.本章主要介绍创建一个基本的颜色拾取器.接下来分析如何将这个控件分解成功能更强大的基于模板的控件. 创建基本的颜色拾取器很容易.然而,创建自定义颜色拾取器仍 ...

  10. Android 自定义控件开发入门(一)

    那么怎样来创建一个新的控件呢? 这得看需求是怎样的了. 1.需要在原生控件的基本功能上进行扩展,这个时候你只需要继承并对控件进行扩展.通过重写它的事件,onDraw ,但是始终都保持都父类方法的调用. ...

最新文章

  1. 【直播】王茂霖:二手车交易价格预测-千变万化特征工程(河北高校数据挖掘邀请赛)
  2. matlab程序的幂法,数值分析课程设计+幂法与反幂法MATLAB
  3. 构建 Spring5 源码工程,开启研读Spring源码之路
  4. DirectSound 混音的实现
  5. 剪映专业版Mac版上线,来讲讲体验感吧
  6. php代码编写直接插入排序算法,PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析...
  7. mysql语言翻译_SQL语句翻译成MYSQL查询
  8. 智能优化算法之海豚回声定位(Dolphin echolocation,DE)
  9. 数论 扩展欧几里德算法
  10. 暴风转码转超清文件_暴风影音16破解版下载-暴风影音16多开精简版(附怎么用) v9.4.1029.1111...
  11. 多种方法教你如何让手机免费上网
  12. Win 10 host文件不见了怎么办?
  13. 《云周刊》第121期:图管够!灌篮高手、女儿国…阿里日_这帮程序员太会玩了!...
  14. 六大危害不容忽视 笔记本外接显示器杂谈
  15. 初探前端微服务——single-spa
  16. 发送的邮件还能撤回吗?如何撤回已经发出的邮件?
  17. web自动化测试-第一讲:selenium快速入门
  18. android简单的自定义涂鸦控件
  19. 地缘剧本杀 (九):抉择(原创小说连载,内含语音)
  20. API接口名称(item_get - 根据ID取商品详情)[item_search,item_get,item_search_shop等]

热门文章

  1. PPT:Semi-supervised Classification with Graph Convolutional Networks
  2. sklearn常用聚类算法模型【KMeans、DBSCAN】实践
  3. 使用Python为时间序列预测创建ARIMA模型
  4. javascript设计模式_详解JavaScript的常用设计模式(二)
  5. 最好的git命令行基础使用教程 windows
  6. 右值引用、移动构造函数和move
  7. python语法学习第十天--类与对象相关的BIF、魔法方法
  8. 端口抢占处理杀死线程端口
  9. linux查找进程并删除文件,Linux find 查找 并删除文件 杀掉进程
  10. java监控文件内容变化_Java使用WatchService监控文件内容变化的示例