此外,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 运行时忽略。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=545087