原址:http://hi.baidu.com/sjbh/blog/item/cc58fd1bd35d3ad2ad6e7593.html
 
简介

  从使用基本的文本编辑器到创作标记页面,Web 开发已经经历了一个漫长的过程。目前,集成开发环境 (IDE) 为开发过程中的几乎每个方面都提供了图形化表示形式。此外,还实现各种说明性编程技术以提高效率并降低出现错误的几率。Visual Studio 2005 和 ASP.NET 2.0 中的控件体系结构遵循了这些编程趋势,并且提供了可靠的、可扩展的环境,该环境设计为使开发人员可以创建能够以说明方式配置的控件。

此外,ASP.NET 中新的自适应呈现模型减少了编写可专门识别其目标浏览器的控件的需要。换句话说,控件开发人员可以专注于设计控件,而让 ASP.NET 框架负责转换控件并针对不同类型的浏览器和设备呈现它。

尽管 ASP.NET 2.0 在控件设计过程中提供了增量改进功能,但实际控件呈现模型已经完全进行了更改。作为自定义控件开发人员,您将会看到利用 ASP.NET 的几个新选项。最重要的是,您将会发现只需编写较少的代码便可完成相同的任务。

在 ASP.NET 2.0 中,创建自定义服务器控件有很多方法,每种方法都有其优点和局限性。本文将讨论与自定义控件的创建和配置相关的详细信息。代码示例和体系结构概念要求您对 C# 编程语言具有中等水平的理解。

自适应呈现模型

在 ASP.NET 1.x 中,自定义控件开发人员必须设计每个服务器控件,以便它可以识别不同的浏览器类型并发出正确的输出。ASP.NET 1.x 控件框架提供了几项功能以使该任务变得更简单,但开发人员仍然必须根据浏览器的类型编写切换程序、开发适当的 HTML,然后针对不同类型的浏览器测试控件。此外,如果开发人员希望控件在移动设备上显示,他必须创建一个与普通 Web 浏览器上使用的控件不同的全新控件。

ASP.NET 2.0 通过新的自适应呈现模型简化了浏览器检测和呈现过程。在 ASP.NET 2.0 中引入的自适应呈现模型旨在用于支持那些众多能够使用标记格式(包括 HTML、WML、XHTML 或 CHMTL)的不同设备。

自适应呈现模型体系结构

每个控件都可以链接到一个适配器,它会针对特定的目标设备修改控件的行为和标记。例如,HTML 适配器将 ASP.NET 控件生成为标准的 HTML 和 DHTML,以便普通 Web 浏览器使用。另一方面,WML 适配器将相同的控件转换成无线标记语言,以便蜂窝电话或其他移动设备使用。


图 1. 控件-适配器寿命周期

上图说明了控件方法与适配器方法之间一对一的映射。如果有适配器(如果控件的 Adapter 属性不为空),执行就会在控件和适配器方法之间传输,如上图所示。在生成阶段,控件对象或适配器对象都可以生成输出(通常情况下两者不同时生成输出)。通常情况下,如果有适配器,那么适配器的实现将覆盖控件的实现。在 ASP.NET 2.0 中,自适应呈现模型适用于所有 ASP.NET 控件(不仅仅是移动控件),并且允许 ASP.NET 2.0 支持统一的控件体系结构。

  实际意义

自适应呈现模型的实际意义有两个主要方面。第一,作为开发人员,您可以一次设计控件并期望它可以在具有适配器的任何类型的设备或浏览器上使用。第二,您可以对常用适配器利用广泛的 Microsoft 测试,减少您自己浏览器的特定测试。

自适应呈现模型还为 ASP.NET 2.0 提供了将其他服务添加到控件生成过程中的机会。由于具有适配器模型,您可以:

1) 根据目标的类型,使用筛选器 来更改控件的外观。

2) 根据目标的类型,使用模板来更改整个页面布局。

3) 根据浏览器控制在浏览器上的呈现,而不必依赖于 ASP.NET 1.x 的 uplevel/downlevel 确定。

在本文中,我们将重点放在创建自定义控件的应用方面。但是,请牢记自适应呈现模型是新的基础框架。

创建自定义服务器控件

Visual Studio 2005 提供了很多用于开发自定义服务器控件的有用工具。为了说明某些功能,我们将创建一个 MailLink 控件,它公开了两个属性:Email 和 Text。该控件将生成必需的 HTML 来将所提供的 Text 包装到 mailto: 链接标记中。

创建项目

在 Visual Studio 2005 中,我们通过在新建项目向导中选择适当的图标来创建一个新的“Web Control Library”项目:


图 2. Visual Studio 2005 中的新建项目向导

该项目是利用默认的自定义控件类实现创建的。对于我们的示例,我们将该默认文件重命名为 MailLink.cs。

注:在解决方案资源管理器中重命名该文件时,Visual Studio 2005 将会自动更新类名。

MailLink 的源代码在由项目向导生成的默认模板上构建。MailLink 类从 WebControl 基类自动派生。

public class MailLink : WebControl {

WebControl 类提供默认实现方法,可以很简单地覆盖这些方法来为我们的控件提供详细说明。

添加属性

在 MailLink 示例中,我们需要添加 Email 和 Text 属性。为了正确配置这些属性,我们不仅必须编写代码,还要分配几个特性。

[Bindable(true),
Category("Appearance"),
DefaultValue(""),
Description("The e-mail address.")]

public virtual string Email {
get { 
string s = (string)ViewState["Email"];
return (s == null) ? String.Empty : s;
}
set {
ViewState["Email"] = value;
}
}

特性(以粗体表示)定义了新控件将如何与设计器 (Visual Studio) 进行交互。Email 属性的特性告诉 Visual Studio 如何在设计过程中处理属性:

1) Bindable — Email 属性可绑定 到数据源。您可以将 Email 字段链接到数据库、XML 文件或任何其他 DataSet。该特性强制 Visual Studio 在控件的可绑定属性列表中显示 Email 属性。

2) Appearance —Email 属性将显示在 Appearance 类别下的属性视图中。您可以选择想要的任何类别,包括默认类别:Appearance、Accessibility、Behavior、Data、 Layout 或 Misc。只要用户选择了属性的类别组织方法,Email 属性将会显示在 Appearance 下。

3) DefaultValue — Email 属性具有一个空的默认值。尽管空值对于 Email 字段来说有意义,但对于您添加到控件中的其他属性可能并不合适。当用户将您的控件放到他们的 Web 页上时,选择适当的默认值可为用户免去不计其数的单击操作。

4) Description — 属性说明显示在控件列表下,并且也可能作为工具提示出现。Email 属性将具有 The e-mail address 说明。

5) Localizable — 它会用发送信号的方式通知 ASP.NET 2.0 Framework 该控件包括可以针对不同语言或位置进行配置的文本属性。

您可以使用 System.ComponentModel 命名空间中的各种特性来进一步改进任何特殊属性的外观和行为。我们将在本文的使用设计器部分中更详细地介绍修改属性或控件的行为的方法。

接下来,我们需要添加 Text 属性。Text 属性与 Email 属性稍有不同,因为我们希望将 Text 显示为由 MailLink 控件发出的 HTML 的一部分。为此,我们需要从 System.Web.UI 命名空间中添加一个新的特性。

[Bindable(true),
Category("Appearance"),
DefaultValue(""),
Description("The text to display on the link."),
Localizable(true),
PersistenceMode(PersistenceMode.InnerDefaultProperty)]
public virtual string Text { 
get {
string s = (string)ViewState["Text"];
return (s == null) ? String.Empty : s;
}
Set { 
ViewState["Text"] = value;
}
}

Text 属性的 PersistenceMode(PersistenceMode.InnerDefaultProperty) 特性(粗体代码)指定设计器应该将该属性作为控件标记内的内部内容序列化。该特性还声明 Text 是控件的默认属性。当用户在 Visual Studio 中使用这个控件时,Text 属性将会作为该控件的内部文本自动显示在图形设计器上,并且如果用户单击该控件并尝试更改显示的文本,Text 属性将会自动更改。

另一方面,应用到属性的特性会影响设计期间用户与控件的交互方式。在运行过程中,这些特性被 ASP.NET 运行时忽略。

  有关 ViewState 的注释

请注意,用于两个属性的 Get 和 Set 方法都利用 ViewState 对象。ViewState 对象是一个内置到 WebControl 类中的帮助器对象。从开发角度讲,ViewState 可被视为一个集合类,用于存储在回发过程中我们想要保留的任意属性。实际上,ViewState 封装了确定如何执行持久性(使用 Cookie、会话等等)所需的所有代码和逻辑。

生成控件

在定义了控件属性之后,接下来的步骤就是要设计将由控件发出的实际响应。在 MailLink 示例中,我们希望设计控件来生成基本的 HTML 标记。

TagKey

WebControl 的默认实现会生成一个 标记。我们的 MailLink 控件通过为 TagKey 属性提供它自己的实现来覆盖该默认实现。TagKey 属性定义将要封装控件内容的最外面的标记。

幸运的是,我们可以使用 HtmlTextWriterTag 枚举来指示链接 标记,而不必实际编写 HTML 文本。该枚举方法用于最常用的 HTML 标记。

protected override HtmlTextWriterTag TagKey {
get {
return HtmlTextWriterTag.A;
}
}

如果您需要生成一个不属于 HtmlTextWriterTag 枚举的一部分的标记,您必须覆盖 WebControl.TagName 属性,而非 TagKey 属性。TagName 属性会返回由控件生成的实际 HTML 标记字符串。TagName 的默认 WebControl 实现只调用 TagKey,并以完美的提取方式提取正确的 HTML。

AttributesToRender

在定义了基本标记之后,接下来的步骤就是分配我们要添加到该标记中的各种特性。我们的 MailLink 控件将覆盖 AddAttibutesToRender 方法以便为“mailto”标记添加适当的标记。

protected override void AddAttributesToRender(
HtmlTextWriter writer){
base.AddAttributesToRender(writer);
writer.AddAttribute(HtmlTextWriterAttribute.Href, 
"mailto:" + Email);
}

对基类的 addAtributeToRender() 调用会被调用,以确保可以正确生成其他样式和特性。如果我们忽略该基本调用,我们可能会失去内置到所有 Web 控件中的母版页设计、筛选器或其他功能。

RenderContents

最后,由于所需的 WebControl 类的方法和属性都已被覆盖,因此可以使用 RenderContents 方法来编写文本。出于安全原因,MailLink 使用 HtmlTextWriter.WriteEncodedText 方法编写 HTML 编码输出。HTML 编码安全地将潜在的危险字符转换为更安全的表示形式。

protected override void RenderContents(
HtmlTextWriter writer) {
if (Text == String.Empty) {
Text = Email;
}
writer.WriteEncodedText(Text);
}

请注意,我们只生成 Text 属性。如果 Text 属性为空,我们将利用 Email 属性填充它。请记住,Text 属性旨在用作控件标记的内部文本。这种类型的控件至少需要某一可显示的文本(以便用户进行单击)。如果我们试图生成一个空字符串,我们将失去链接标记的预期功能。

欢迎加群互相学习,共同进步。QQ群:iOS: 58099570 | Android: 572064792 | Nodejs:329118122 做人要厚道,转载请注明出处!
本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/sunshine-anycall/archive/2009/04/08/1432004.html,如需转载请自行联系原作者

[转]利用ASP.NET 2.0创建自定义Web控件(1)相关推荐

  1. 探讨ASP.NET 2.0中的Web控件改进技术(3)

    当你最开始在Visual Studio 2005中使用Windows表单控件或是ASP.NET Web控件时,你首先会注意到,在许多控件右上角出现一个箭头形状的小玩意儿(见图2中的示例).点击这个箭头 ...

  2. 探讨ASP.NET 2.0中的Web控件改进技术(2)

    我的观点是:ViewState有可能成为你最好的朋友,也有可能成为你最坏的敌人-这要依赖于你使用它的方式来决定.如果你在以前曾经使用过ViewState,那么,你肯定会喜欢新的ControlState ...

  3. 探讨ASP.NET2.0中的Web控件改进技术

    全面探讨ASP.NET 2.0中的Web控件改进技术之概述(一) ASP.NET 2.0并没有抛弃1.1版本中的任何现有控件,而是增加了一组新的控件;同时还引入了若干新的控件开发技术.本系列文章将对这 ...

  4. ASP.NET 2.0中使用Gridview控件的高级技巧

    ASP.NET 2.0中,新增加的gridview控件的确十分强大,弥补了在asp.net 1.1中,使用datagrid控件时的不足之处.因为在asp.net 1.1中,在使用datagrid时,很 ...

  5. 创建自定义验证控件(1)

    写一个创建自定义的控件的文章.帮大家了解如何写自定义验证控件. 首先写个简单的,长度验证控件,大家在写用户注册的时候,很多时候需要验证用户密码长度在多少到多少之间. 我们通过从BaseValidato ...

  6. 使用ASP.NET 2.0中的GridView控件

    在ASP.NET 2.0中,加入了许多新的功能和控件,相比asp.net 1.0/1.1,在各方面都有了很大的提高.其中,在数据控件方面,增加了不少控件,其中的gridview控件功能十分强大.在本文 ...

  7. Ajax 1.0 中使用web控件调用后台方法的用法.

    今天在做页面文本框审核的时候发现个Ajax 1.0 中使用web控件调用后台方法的一个不爽的地方. 把该调用方法发上来供大家参考. 首先我们创建一个MasterPage.master文件. 在页面上放 ...

  8. (转) ASP.NET 2.0:使用用户控件和定制的Web部件个人化你的门户网站(二)

    Web部件目录 我们已经见过了如何在 WebPartZones 控件中事先放入Web部件.你还可以用另外一种方法完成这个功能,那就是允许用户在运行时添加新的Web部件.通过使用 CatalogZone ...

  9. Qt 实现 QQ 9.0版 自定义菜单控件

    #简述 重新最近开始了QQ最新版 9.0 界面的模仿,前几天搞了一个QQ登陆界面的动画效果详情见 QQ 9.0 新版登录窗口登录特效 ,今晚Qt技术学习班分享了QQ 9.0版本的自定义菜单控件,通过Q ...

最新文章

  1. Docker客户端常用命令整理
  2. 【408预推免复习】计算机组成原理之计算机的发展及应用
  3. JavaScript的类型、值和变量
  4. 微服务架构,如何做分布式,通用缓存机制?
  5. Java环境变量配置详细步骤
  6. CSS3 border-radius妙用
  7. Hyper-V第1代虚拟机和第2代虚拟机特性对照表
  8. tcp 三次握手,四次挥手
  9. LeetCode 1758. 生成交替二进制字符串的最少操作数(DP)
  10. 博客园上海地区活动——LinkCoder主题社区第二期:淘宝服务化架构的设计和实践...
  11. 计算机外部设备的配置及扩展能力也是计算机,计算机1-6修改后.docx
  12. 怎样在计算机硬盘里新建文件,高手教你轻松新建文件夹
  13. (4)华为ensp--RIP基本配置
  14. 此页面上的脚本造成Web浏览器运行速度减慢。如果继续运行,您的计算机将可能停止响应。
  15. php shopex,用PHP为SHOPEX增加日志功能代码
  16. 【经验】使用WPS的公式编辑器时,弹出提示“MT Extra 字体无效,请重新安装”
  17. 使用FFmpeg合并多个MP4视频
  18. 2016年全国高中数学联合竞赛试题及详细解答
  19. 苹果手机各种型号图片_一图看懂iPhone各机型机身尺寸大小对比!
  20. Tridium公司的Niagara N4 使用

热门文章

  1. File System Filter Driver Tutorial
  2. 位居全国第一- 丰收节交易会·内蒙古:名特优新农产品数量
  3. Zjoi2010排列计数Perm
  4. [NOIP2012提高组]国王游戏
  5. 圣思园java se培训总结(82-)(观察者设计模式)
  6. C++中关于配置文件的问题
  7. 通用多表分页存储过程
  8. 人不会一直寂寞,匿名社交也不会一直活跃?
  9. 问答专场 | 我是蝉游记创始人纯银V,你有什么想问我?
  10. PMCAFF | 产品经理十宗罪(冷静反思篇)