女女 - 2007-6-19 9:26:00
ASP.NET
演练:开发和使用自定义服务器控件
请参见
全部折叠 全部展开 语言筛选器: 全部 语言筛选器: 多个 语言筛选器: Visual Basic 语言筛选器: C# 语言筛选器: C++ 语言筛选器: J# 语言筛选器: JScript
Visual Basic(声明)
Visual Basic(用法)
C#
C++
J#
JScript
此演练演示如何创建和编译自定义 ASP.NET 服务器控件以及如何在页中使用该控件。
通过此演练,您将学会如何执行以下任务:
创建一个 ASP.NET 服务器控件。
向该控件及其成员添加元数据以控制安全性和设计时行为。
使用 ASP.NET 网站中的 App_Code 目录对控件进行测试(无需手动编译步骤)。
在配置文件和该控件的程序集中指定一个标记前缀。
将该控件编译为一个程序集并将其添加到 Bin 目录中。
将一个位图嵌入到该控件的程序集中,以作为可视化设计器的工具箱图标使用。
在页中使用已编译的控件。
可视化设计工具(如 Microsoft Visual Studio 2005)可以简化控件的开发过程,但并不是创建或生成自定义控件的必不可少的工具。可以通过使用任何文件编辑器创建控件,并使用 .NET Framework SDK 附带的编译器从命令行生成这些控件。无论以何种方式创建控件,在可视化设计器中控件的设计时外观和行为都将相同。页开发人员可将控件添加到可视化设计器的工具箱,可将其拖动到设计图面上,还可以在属性浏览器中访问其属性和事件。在有些可视化设计器(如 Visual Studio 2005)中,自定义控件还可自行支持 IntelliSense。
创建服务器控件
要创建的控件 WelcomeLabel 是一个简单控件,与标准的 Label 控件类似。WelcomeLabel 类从 WebControl 派生,它定义了一个 Text 属性,该属性允许页开发人员提供一个文本字符串,以欢迎访问站点的用户。如果用户名出现在用户浏览器发送的标题中,WelcomeLabel 就会将用户名追加到该文本字符串。有关检索用户名的更多信息,请参见 User。例如,如果页开发人员将“Hello”设置为 Text 属性的值,则根据标题中是否出现用户名,WelcomeLabel 将呈现“Hello, userName!”或“Hello!”。
创建自定义服务器控件的代码
创建一个名为 WelcomeLabel.cs 或 WelcomeLabel.vb 的文件。
将以下代码添加到控件的源文件中:
Visual Basic 复制代码
' WelcomeLabel.vb
Option Strict On
Imports System
Imports System.ComponentModel
Imports System.Security.Permissions
Imports System.Web
Imports System.Web.UI
Imports System.Web.UI.WebControls
Namespace Samples.AspNet.VB.Controls
< _
AspNetHostingPermission(SecurityAction.Demand, _
Level:=AspNetHostingPermissionLevel.Minimal), _
AspNetHostingPermission(SecurityAction.InheritanceDemand, _
Level:=AspNetHostingPermissionLevel.Minimal), _
DefaultProperty("Text"), _
ToolboxData( _
"<{0}:WelcomeLabel runat=""server""> </{0}:WelcomeLabel>") _
> _
Public Class WelcomeLabel
Inherits WebControl
< _
Bindable(True), _
Category("Appearance"), _
DefaultValue(""), _
Description("The welcome message text."), _
Localizable(True) _
> _
Public Overridable Property Text() As String
Get
Dim s As String = CStr(ViewState("Text"))
If s Is Nothing Then s = String.Empty
Return s
End Get
Set(ByVal value As String)
ViewState("Text") = value
End Set
End Property
Protected Overrides Sub RenderContents( _
ByVal writer As HtmlTextWriter)
writer.WriteEncodedText(Text)
If Context IsNot Nothing Then
Dim s As String = Context.User.Identity.Name
If (s IsNot Nothing) AndAlso (s <> String.Empty) Then
Dim split() As String = s.Split("\".ToCharArray)
Dim n As Integer = split.Length - 1
If (split(n) <> String.Empty) Then
writer.Write(", ")
writer.Write(split(n))
End If
End If
End If
writer.Write("!")
End Sub
End Class
End Namespace
C# 复制代码
// WelcomeLabel.cs
using System;
using System.ComponentModel;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace Samples.AspNet.CS.Controls
{
[
AspNetHostingPermission(SecurityAction.Demand,
Level = AspNetHostingPermissionLevel.Minimal),
AspNetHostingPermission(SecurityAction.InheritanceDemand,
Level=AspNetHostingPermissionLevel.Minimal),
DefaultProperty("Text"),
ToolboxData("<{0}:WelcomeLabel runat=\"server\"> </{0}:WelcomeLabel>")
]
public class WelcomeLabel : WebControl
{
[
Bindable(true),
Category("Appearance"),
DefaultValue(""),
Description("The welcome message text."),
Localizable(true)
]
public virtual string Text
{
get
{
string s = (string)ViewState["Text"];
return (s == null) ? String.Empty : s;
}
set
{
ViewState["Text"] = value;
}
}
protected override void RenderContents(HtmlTextWriter writer)
{
writer.WriteEncodedText(Text);
if (Context != null)
{
string s = Context.User.Identity.Name;
if (s != null && s != String.Empty)
{
string[] split = s.Split('\\');
int n = split.Length - 1;
if (split[n] != String.Empty)
{
writer.Write(", ");
writer.Write(split[n]);
}
}
}
writer.Write("!");
}
}
}
代码讨论
下面的代码讨论并不是执行此演练中的步骤必不可少的内容,可以在开始时跳过。但是,如果您初学控件创作,我们建议您至少要在完成演练后阅读此内容。
如果控件要呈现用户界面 (UI) 元素或任何其他客户端可见的元素,则应从 System.Web.UI.WebControls.WebControl(或派生类)派生该控件。如果控件要呈现在客户端浏览器中不可见的元素(如隐藏元素或 meta 元素),则应从 System.Web.UI.Control 派生该控件。WebControl 类从 Control 派生,并添加了与样式相关的属性,如 Font、ForeColor 和 BackColor。此外,一个从 WebControl 派生的控件也自行参与到 ASP.NET 的主题功能。
如果您的控件要扩展现有控件(如 Button、Label 或 Image 控件)的功能,则可以从该控件派生。由于 WelcomeLabel 扩展了 Label 控件的功能,因此它可从 Label 派生。但是,本演练从 WebControl 派生 WelcomeLabel 以演示如何定义属性和定义属性元数据。
WelcomeLabel 定义一个 Text 属性,并使用视图状态存储该属性值。使用视图状态保存回发间的 Text 值。每次回发时,将重新创建页并从视图状态还原值。如果 Text 值并未存储在视图状态中,则在每次回发时会将值设置为其默认的 Empty。ViewState 属性继承自 WebControl,是保存数据值的字典。通过使用 String 键,可输入和检索值。本例中将“Text”用作键。字典中的项被类型化为 Object,然后必须将其强制转换为属性类型。有关更多信息,请参见 ASP.NET 状态管理概述。
WelcomeLabel 控件通过重写继承的 RenderContents 方法呈现其 Text 属性。传入 RenderContents 方法的参数是 HtmlTextWriter 类型的对象,是具有呈现标记和其他 HTML(和 HTML 变量)标记的方法的实用工具类。
注意,WelcomeLabel 会连续调用 HtmlTextWriter 对象的 Write 方法,而不是先执行字符串串联然后调用 Write 方法。由于 HtmlTextWriter 对象直接写入输出流,因此这样可以提高性能。字符串串联需要时间和内存来创建字符串,然后写入流。在控件中实现呈现时,应按照本演练中说明的模式进行操作。