您的位置:首页 > 编程语言 > ASP

ASP.NET 2.0 Web Part编程之定制Web Part

2007-01-16 16:56 274 查看
一、引言

如今,软件开发正由OO时代进入到“面向组件的开发”时代。Visual Basic和ASP.NET这样一些编程工具之所以越来越流行,其主要原因在于:使用可视化方式描述对象更贴近自然,也因此进一步提高了软件的生产效率。另一方面,通过这种方式,开发人员能够以其自己特有的方式(如以.dll,.ascx等文件形式)来创建和发布控件,从而极大地方便了广大软件开发者。

借助于组件(非可视化对象)和控件(可视化对象),我们可以重用这些软件元件所具有的功能,并最终创建出更高效的应用程序。

在上一世纪九十年代前后的Web世界中,所谓“动态的网页”,也就是每隔几周才更新一次的静态Web页面罢了。到九十年代后期,终端开发用户的动态内容的概念开始转变为使用服务器端处理技术,例如,当一个用户向他们的网站发出一个请求时,使用动态服务器页面来生成一个HTML页面。

随着Web应用程序用户对Web的理解越来越深入,他们的用户体验期望经历了巨大的变化。特别是,最近发展起来的AJAX现象又进一步加快了Web应用程序的这种动力和交互性,而终端用户开始能够尝试到这种体验,甚至能够根据自己的要求“裁剪”这种体验。

在本文中,我们先简单回顾一下ASP.NET Web Parts的粗略架构;然后,我们着手创建一个定制的Web Part控件,从而领略一下ASP.NET 2.0为进一步扩展创建定制服务器控件的技术。

二、ASP.NET Web Parts架构

Web Part提供了一种对我们已习惯的ASP.NET控件模型的扩展―添加重要的定制和个性化方面,以及那些能够在运行时刻由开发者或应用程序用户决定的方面。

用户能够在运行时刻决定哪一部分Web Part将会出现在他们的个性化的Web页面实例上,以及这些内容看起来的样子。

为了支持这一ASP.NET特征,开发者必须首先创建.ASPX页面形式的Web页面―它们将包含Web Part并且与用户进行交互以便他们能够在运行时刻作出自己所希望的选择。

【重要结论】一个宿主ASP.NET 2.0 Web Part的.ASPX页面必须包含且仅包含一个WebPartManager控件以及一个或多个WebPartZone控件的实例。

其中,这个WebPartManager控件能够为你的页面使用Web Part提供基层框架支持,而WebPartZone用于定义能够包含Web Part的页面中的区域。这些区域(即“Zone”)用于把页面组织成此页面中的一些相关联的块。

除WebPartZone控件之外,还存在另外两个ASP.NET开发者可自由使用的Zone控件―CatalogZone和EditorZone控件。

一个CatalogZone用作一个容器,用于枚举可用在某页面中的Web Part控件;而EditorZone控件中包含一个编辑器―用户将调用之来设置包括在他们的Web页面上的Web Part中的属性。

下图1展示了一个使用Web Part控件的.ASPX页面的一般架构。而图2则展示了这一架构在实际中的使用情形。




[align=center] [/align]
[align=center][/align]
[align=center]图1.一个使用Web Part控件的.ASPX页面的一般架构[/b][/align]
[align=center][/b] [/align]
注意,下图2中的页面上有两个可见的带(Zone),一个包含左边栏目,另一个包含右边栏目。其中,高亮区域是单个Web Part。




[align=center] [/align]
[align=center][/align]
[align=center]图2.[/b]实际使用Web Part[/b]控件的.ASPX[/b]页面情况[/b][/align]
[align=center][/b] [/align]
点击上图2中的“Add stuff”链接后可以使一个目录带看起来如下图3所示。




[align=center]图3.目录区带看上去的样子[/b][/align]在此,用户可以选择需要的Web Part控件―该控件提供他们选择的内容或功能,例如收集自各种数据源的RSS回馈数据等。

如果用户点击其中一个特定Web Part上的“Edit”链接(例如图3中的高亮区带),则将出现相应于一个Part特定的编辑器。

该Part特定的编辑器可以包含开发者认为适当的任何用户定制。用户可以从中选择要显示多少项,以及是否显示指定图像等。

当启动“Edit”模式时,Web Part能够围绕着一个Web Part Zone或在两个区带间移动。此外,Web Part还能够被连接到Part间建立的属性绑定。例如,一个Web Part的属性可以用于约束在一个不同的Web Part上显示的数据。

【重要结论】任何ASP.NET控件都能够不经任何修改用作一个Web Part。例如,任何现有的ASP.NET控件、用户控件或定制控件都能够简单地拖放到一个WebPartZone中的一个.ASPX页面中。

注意,这个“拖放”将引起一个对WebPartManager的CreateWebPart()方法的隐式调用―此方法将创建一个GenericWebPart对象实例并且使用你添加到页面中的控件来初始化这个GenericWebPart对象。你可以在设计时刻或运行时刻动态地使用任何标准控件作为一个Web Part。

因此,一旦我们搞清楚了所谓的“Zone架构”,那么,使用Web Part进行Part开发则非常类似于使用Visual Studio进行的任何其它可视化控件开发。而且,创建定制的Web Part与开发定制ASP.NET控件之间存在很大相似之处―创建定制的Web Part需要继承自WebPart类,而创建定制ASP.NET控件需要继承自Control类。

三、创建定制的Web Part

在WebParts控件组出现之前,尽管开发者也可以模拟现在Web Part所具有的大多数功能;但是,开发者必须在后台以编程方式添加大量的属性―例如在一个Web Part中所频繁使用的GenericWebPart属性。尽管这种方法完全可行;但是如今,构建包括这种功能的Web应用程序的开发者却逐渐趋向于先构建全面支持“Web Part”功能的控件―然后再把这些“积木块”应用于Web页面开发。

就象创建标准ASP.NET控件一样,创建定制的Web Part控件也存在两种典型的方法―用户Web Part和定制Web Part。

(一)第一种方法―继承自基类[/b]WebPart[/b]
[/b]
我们可以创建一个继承自基类WebPart的定制控件。这种方法的一大优点是:这类控件能够被编译成一个二进制.DLL文件,而且该.DLL可安装到全局程序集缓存(GAC)中。

此时,我们的类可能看起来如下面的列表1所示。

列表1―定制Web Part的典型代码


Imports System.ComponentModel
Imports System.Web.UI
<{0}:SampleControl runat="server">")>
Public Class SampleControl
Inherits System.Web.UI.WebControls.WebParts.WebPart
Private strSubtitle As String
Private _Title As String = "我的WebPart"
Public Sub New()
strSubtitle = "关于" & Now.ToString
Me.TitleIconImageUrl = "mySampleIcon.gif"
End Sub
Private Sub BookDisplay_Init(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Init
MyBase.HelpUrl = "http://www.example.net/myWebPartHelp.htm"
End Sub
Public Overrides Property Title() As String
Get
Return MyBase.Title
End Get
Set(ByVal value As String)
MyBase.Title = _Title
End Set
End Property
Public Overrides ReadOnly Property Subtitle() As String
Get
Return strSubtitle
End Get
End Property
Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
MyBase.Render(writer)
End Sub
End Class


在构建编译控件时,.DLL形式使得控件的发布非常容易,而且此控件的应用范围不并局限于定义它们的应用程序;但遗憾的是,以这种方式构建的控件却缺乏可视化的设计体验。(二)第二种方法―用户控件+实现[/b]IWebPart[/b]接口[/b]
[/b][/b]
下面,我们将集中讨论第二种途径―构建UserControl风格的Web Part。我们可以通过创建一个ASP.NET用户控件并实现IWebPart接口来创建一个用户Web Part。列表2展示了一个实现了IWebPart接口的Web Part类的框架。

列表2―以实现IWebPart接口途径创建的用户Web Part典型代码


Class myWebUserControl
Inherits System.Web.UI.UserControl
Implements IWebPart
Private _CatalogIconImageUrl As String = "images/5PointStar.gif"
Public Property CatalogIconImageUrl() As String Implements System.Web.UI.WebControls.WebParts.IWebPart.CatalogIconImageUrl
Get
Return _CatalogIconImageUrl
End Get
Set(ByVal value As String)
_CatalogIconImageUrl = value
End Set
End Property
'描述
Private _Description As String = "【定制Web Part】"
Public Property Description() As String Implements System.Web.UI.WebControls.WebParts.IWebPart.Description
Get
Return _Description
End Get
Set(ByVal value As String)
_Description = value
End Set
End Property
'副标题
Private _Subtitle As String = ""
Public ReadOnly Property Subtitle() As String Implements System.Web.UI.WebControls.WebParts.IWebPart.Subtitle
Get
Return _Subtitle
End Get
End Property
'标题
Private _Title As String = "【我的定制Web Part】"
Public Property Title() As String Implements System.Web.UI.WebControls.WebParts.IWebPart.Title
Get
Return _Title
End Get
Set(ByVal value As String)
_Title = value
End Set
End Property
' TitleIconImageUrl
Private _TitleIconImageUrl As String = "images/5PointStar.gif"
Public Property TitleIconImageUrl() As String Implements System.Web.UI.WebControls.WebParts.IWebPart.TitleIconImageUrl
Get
Return (_TitleIconImageUrl)
End Get
Set(ByVal value As String)
_TitleIconImageUrl = value
End Set
End Property
' TitleUrl
Private _TitleUrl As String = "http://www.example.com"
Public Property TitleUrl() As String Implements System.Web.UI.WebControls.WebParts.IWebPart.TitleUrl
Get
Return _TitleUrl
End Get
Set(ByVal value As String)
_TitleUrl = value
End Set
End Property
End Class


接下来,我们需要在我们的定制用户控件上添加可视化元素。在本示例中,我们将添加三个文本框―它们结合在一起形成我们的定制控件;当然,你也可以使用任何其它ASP.NET控件。

【提示】尽管这是一个Web Part,但是,它本质上还是一个ASP.NET用户控件;所以,你可以在此封装你想实现的任何功能。

现在,对于该控件中的每一个用户接口部件―我们想使终端用户在运行时刻能够配置它们。为此,我们必须在此控件中定义一个布尔指示器,用于根据用户的选择决定是否应该显示该元素。

于是,每一个部件看起来具有如下形式:

Protected _PropertyONE As Boolean = True

WebDisplayName("显示第一项内容"), _
WebDescription("使用该属性来显示/隐藏第一项内容")> _
Public Property PropertyONE() As Boolean
Get
Return _PropertyONE
End Get
Set(ByVal value As Boolean)
_PropertyONE = value
End Set
End Property
【注意】这里的属性被标记为“Personalizable”。借助于这个系统提供的属性,在修改该属性时,属性的状态将会被自动地保存。另外,该属性还被标记为“WebBrowsable”;这样以来,我们就可以在一个类似于PropertyGridEditorPart(这个控件与AppearanceEditorPart、BehaviorEditorPart、LayoutEditorPart控件及它们共同的容器控件EditorZone共同构成个性化Web Part页面的“五剑客”)的设计器中修改它。默认情况下,被标记为“Personalizable”属性的值将会被保存到一个位于你的应用程序的根文件夹(App_Data)下的Microsoft SQL Server 2005 Express数据库(ASPNETDB.MDF)表格中。当然,你也可以修改此个性化数据所存储的位置―通过修改你的应用程序的Web配置文件实现。

对于与特定用户相关联的特定值,ASP.NET框架必须能够识别这个当前用户。你还可以在Windows和表单认证(Windows认证是缺省的认证方式)中使用个性化设置。当使用表单认证时,在用户请求页面之前,此用户必须先被认证。因为ASP.NET 2.0针对会员实现了“提供者模型”;所以,你可以使用任何可用的会员提供者程序。
另一方面,上面WebDisplayName和WebDisplayDescription两个属性被自动地应用于我们的WebPartEditor。每一个属性的Boolean值都将会根据Web Part属性编辑器中的复选框进行设置。

对于每一个我们想由用户配置的用户接口元素定义了一个WebBrowsable属性之后,接下来,在页面加载中设置任何用户选择的元素的“Visible”属性之前,我们就可以简单地使用这些属性。

Protected Sub Page_PreRender(ByVal sender As Object,ByVal e
As System.EventArgs) Handles Me.PreRender
TextBox1.Visible = PropertyONE
TextBox2.Visible = PropertyTWO
TextBox3.Visible = PropertyTHREE
End Sub
(二)测试定制的[/b]Web Part[/b]控件[/b]
[/b][/b]
现在,我们的基本Web Part已经准备好待用;所以,我们可以构建一个简单的.ASPX容器来测试我们的Web Part。

为此,我们需要构建一个包含一个WebPartManager、一个WebPartZone和一个EditorZone的.ASPX页面。

在Visual Studio的方案资源管理器中,我们可以拖动我们的定制控件相应的.ASCX文件,并且把它投放到WebPartZone上。

然后,我们再从WebParts工具箱中把一个WebPartEditorZone控件拖动到我们的页面的EditorZone上面。

【注意】WebPartZone控件提供了一组丰富的属性以便我们美化控件界面。例如,在我们的演示应用程序中,我们已经设置了相应的属性用于添加颜色和边界为显示的缺省菜单(当用户配置Web Part时)。

在我们能够运行这个应用程序之前,还需要加入一项功能―我们需要提供给用户一种方法用于切入/切出“Edit”模式。

为此,我们仅把一个按钮控件添加到我们的Web表单上,并且在它的Click事件处理器中相应地设置我们的WePartManager的DisplayMode属性。

Protected Sub Button1_Click(ByVal sender As Object,ByVal e As _
System.EventArgs) Handles Button1.Click
If Not WebPartManager1.DisplayMode Is _
WebPartManager.EditDisplayMode Then
WebPartManager1.DisplayMode = WebPartManager.EditDisplayMode
Button1.Text = "设置编辑模式为Off"
Else
WebPartManager1.DisplayMode = WebPartManager.BrowseDisplayMode
Button1.Text = "设置编辑模式为On"
End If
End Sub
至此,你可以开始运行你的第一个Web Part应用程序了。

四、小结

很明显,本文仅是一个创建定制Web Part控件的入门篇。创建开发者定制的服务器端控件是ASP.NET 2.0提供的一项重要功能,如今借助于Portal Framework,我们又可以创建定制的Web Part控件,从而进一步扩展了这一功能。

实际上,ASP.NET Web Part框架是一组极为丰富和复杂的技术。现在,既然你初步了解了Web Part的威力,那么接下来,你应该着手探索使用它进行一些更高级的开发―创建完整的、可个性化设置的Web应用程序(如本文前面图2所示的微软Windows Live门户网站)了。

【注】本文提供了示例程序完整的源码,读者可进行复制/粘贴试验(环境为Windows XP Professional+VS2005)。本文出自 “青峰” 博客,转载请与作者联系!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: