本文包含了建立并运行 WebPart 数据绑定控件的说明,并在文章[Web 部件的数据绑定控件实例]中提供了一个完整的代码实例。代码实例演示了如何创建一个把 GridView 控件绑定到数据源的自定义服务器控件,因为该控件同样继承自 WebPart 类,所以它能够参与到 Web 部件的应用程序中。本文为你提供了相关的信息以帮助你编译代码实例并为了把该控件当成 Web 部件控件来运行而配置 ASP.NET Web 应用程序。
编译 WebPart 控件
要让代码实例得以运行,你必须先编译源代码。你可以明确地编译它并把结果汇编集保存到网站的 Bin 目录或者是全局汇编集缓存中。另外,你也可以把源代码保存到网站的 App_Code 目录中,从而能够在运行时进行动态编译。本文的代码实例使用的是动态编译。关于如何进行编译的演示实践,请参考:[ASP.NET 实践:开发并使用自定义的服务器控件]。
动态编译 WebPart 数据绑定控件
-
在 Web 应用程序的根目录,创建一个 App_Code 目录。
-
从文章[Web 部件的数据绑定控件实例]中得到这个自定义 WebPart 数据绑定控件的源代码。把源代码保存到 App_Code 目录中。因为我们使用的是动态编译,所以文件的名称可以随意指定,但是文件必须要拥有适当的扩展名,并且与你所使用的编程语言相对应(如 .cs 或 .vb)。
在 Web 部件应用程序中使用该控件
要对应用程序进行配置以使用 Web 部件,你需要拥有一个能够识别单独用户的 ASP.NET 网站、以及一个允许处理应用程序服务(包括个性化)的数据库。关于这个实例(因为它使用了数据绑定控件),你同样需要在 Web.config 文件中创建一个数据库连接串以允许数据源连接到 Northwind 实例数据库。当应用程序被配置以后,在每个 Web 部件应用程序中你都需要为每个将在 Web 部件应用程序中托管 WebPart 和服务器控件的 Web 页面添加一个 WebPartManager 控件以及至少一个 WebPartZone 控件。接下来的第二个过程演示了如何添加这些控件,并在运行时完成页面中数据绑定控件的其他步骤时所必需的准备工作。
配置 ASP.NET 应用程序来运行 Web 部件控件
-
确定你拥有一个能够单独用户进行识别的已配置 ASP.NET Web 应用程序。如果你需要得到如何创建网站的指导,请参考:[ASP.NET 实践:在 IIS 中创建并配置虚拟目录]或者[ASP.NET 实践:在 IIS 中创建并配置本地 ASP.NET 网站]。
-
确定你拥有一个已配置的个性化提供者和数据库。Web 部件的个性化在默认的时候是被启用的,并且它与 Microsoft SQL Server Express(SSE)一起使用 SQL 个性化提供者(SqlPersonalizationProvider)。本文使用的是 SSE 和默认的 SQL 提供者。如果你已经安装了 SSE,则不需要进行任何配置。SSE 是 Microsoft Visual Studio 2005 的一个可选的安装部分,或者从 Microsoft.com 免费下载。要使用一个完整版本的 Microsoft SQL Server,你必须安装并配置一个 ASP.NET 应用程序服务数据库,并配置 SQL 个性化提供者来连接到这个数据库。关于详细内容,请参考:[为 SQL Server 创建并配置应用程序服务数据库]。你同样可以创建并配置自定义的提供者来使用其他的非 SQL 数据库或者存储方案。关于详细内容和代码实例,请参考:[实现成员资格提供者]。
-
创建一个能够让数据绑定控件连接到 Northwind 实例数据库的连接串。要运行这个实例,你需要访问由 SQL Server 所提供的 Northwind 实例数据库。如果你没有安装 Northwind 实例数据库,你可以从 Microsoft Download Center 下载相关的脚本来创建并安装这个数据库。
关于数据库连接串的一个推荐的方法就是把它们保存到应用程序的 Web.config 文件中。关于配置文件的更多信息,请参考:[ASP.NET 配置文件]。下列代码实例演示了 Web.config 文件中的一个数据库连接串,它连接到运行在本地 SSE 中的一个 Northwind 数据库实例。注意,数据库文件路径中的单引号以实体的方式被呈现(")。因为 Web.config 文件是 XML 文件,所以这样做是必需的。
<connectionStrings> <add name="nwind" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename= "C:\SQL Server 2000 Sample Databases\NORTHWND.MDF"; Initial Catalog=Northwind;Integrated Security=True;" providerName="System.Data.SqlClient" /> </connectionStrings>
提示:推荐你对数据库连接串中的所有机密信息(如密码)进行加密。关于加密配置数据的详细内容,请参考:[ASP.NET 实践:使用被保护的配置加密配置信息]。
-
在 Web.config 文件的 <system.web> 部分,添加一个 <webParts> 元素。这在 Web 部件应用程序中并不是必需的,但是 Web 部件中的某些特征的使用是必须要在这个部分进行配置的。WebPart 数据绑定控件实例能够导出一个包含它的状态和属性数据的配置文件。因为 Web 部件应用程序的导出特征在默认的时候是被禁用的,所以你必须在 <webParts> 部分对它进行启用。为 <webParts> 元素添加一个 enabledExport 参数并设置它的值为 true,如下列代码实例所示。
<webParts enableExport="true" />
-
保存并关闭 Web.config 文件。
准备让 Web 页面来托管 Web 部件控件
-
为 Web 页面创建一个将要允许用户在可用的 Web 部件显示模式之间进行转换的用户控件。这个控件以及下一个步骤中 Web 部件的数据绑定控件的运行来说并不是必需的,但是这是多数 Web 部件页面中比较实用的特征。在编辑器中,粘贴下列用户控件的代码,并把文件保存到 Web 应用程序的根目录中,命名为 DisplayModeMenuCS.ascx 或者 DisplayModeMenuVB.ascx(取决于你所使用的编程语言)。
<!-- 这个用户控件认可页面区域中的显示模式,并允许用户在显示模式中进行转换。 --> <%@ control language="C#" classname="DisplayModeMenuCS"%> <script runat="server"> // 使用一个字段来引用当前的 WebPartManager。 WebPartManager _manager; void Page_Init(object sender, EventArgs e) { Page.InitComplete += new EventHandler(InitComplete); } void InitComplete(object sender, System.EventArgs e) { _manager = WebPartManager.GetCurrentWebPartManager(Page); String browseModeName = WebPartManager.BrowseDisplayMode.Name; // 使用被支持的显示模式来填充下拉列表框。 foreach (WebPartDisplayMode mode in _manager.SupportedDisplayModes) { String modeName = mode.Name; // 确保模式在添加之前是可用的。 if (mode.IsEnabled(_manager)) { ListItem item = new ListItem(modeName + " Mode", modeName); DisplayModeDropdown.Items.Add(item); } } } // 把页面改变成被选择的显示模式。 void DisplayModeDropdown_SelectedIndexChanged(object sender, EventArgs e) { String selectedMode = DisplayModeDropdown.SelectedValue; WebPartDisplayMode mode = _manager.SupportedDisplayModes[selectedMode]; if (mode != null) _manager.DisplayMode = mode; } void Page_PreRender(object sender, EventArgs e) { DisplayModeDropdown.SelectedValue = _manager.DisplayMode.Name; } </script> <div> <asp:DropDownList ID="DisplayModeDropdown" runat="server" AutoPostBack="true" OnSelectedIndexChanged="DisplayModeDropdown_SelectedIndexChanged" /> </div>
-
创建一个新的 ASP.NET 页面来托管自定义的 WebPart 控件以及其他控件。在页面中的 Page 指令下面添加一个 Register 指令来注册你刚才所创建的用户控件。指令的内容取决于你所使用的编程语言,它看上去应该与下列实例一样。
<%@ register src="displaymodecs.ascx" tagname="displaymodecs" tagprefix="uc1" %>
-
现在为自定义的 WebPart 控件添加一个 Register 指令。因为本文使用的是动态编译,所以你不需要为 Register 指令添加 Assembly 参数。在 Register 指令的下面,添加另外一个 Register 指令,为它的 tagprefix 参数指派任意一个字符串,并在 namespace 参数中为自定义控件的指派命名空间,这同样取决于你所使用的编程语言,如下实例所示。
<%@ register tagprefix="aspSample" namespace="Samples.AspNet.CS.Controls" %>
-
在 <form> 元素中间,为页面添加一个 <Asp:WebPartManager> 元素,如下列代码实例所示。每一个使用 Web 部件的页面中都需要一个 WebPartManager 控件。
<asp:webpartmanager id="WebPartManager1" runat="server"> </asp:webpartmanager>
-
在 <Asp:WebPartManager> 元素的下面,为显示模式的转换而声明用户控件。你对控件的声明取决于你所使用的编程语言,如下列代码实例所示。
<uc1:displaymodecs id="Displaymodecs1" runat="server" />
-
在用户控件之后,添加一个拥有一行两列的表格,用来构成控件在页面中的布局。表格标记看起来应该像下列代码实例。
<table style="width: 80%; position: relative"> <tr valign="top"> <td style="width: 40%"> </td> <td style="width: 40%"> </td> </tr> </table>
-
在每一个 <td> 标记集中,添加一个 <Asp:WebPartZone> 元素。继承自 WebPartZoneBase 类的区域在包含 WebPart 控件并允许他们拥有全部 Web 部件功能的时候是必需的。第一个区域的标记看起来应该像下列代码实例。
<asp:webpartzone id="WebPartZone1" runat="server" style="position: relative" > <parttitlestyle font-size="14" font-names="Verdana" /> <zonetemplate> </zonetemplate> </asp:webpartzone>
第二个区域的标记看起来应该像这样。
<asp:webpartzone id="WebPartZone2" runat="server" style="position: relative" > <zonetemplate> </zonetemplate> </asp:webpartzone>
-
在第一个区域中的 <ZoneTemplate> 标记之间声明自定义的 WebPart 数据绑定控件,如下列代码实例所示。注意到标记使用了在 Register 指令中为控件所定义的标记前缀,以及自定义控件的类名称。同样注意到被定义在控件的自定义属性中的 ConnectionString 是作为一个参数出现的,该参数的值被指派成 Web.config 文件中的数据库连接串。这个方法允许页面开发者决定控件所使用的连接串。标记看起来应该像这样。
<aspSample:SmallGridWebPart id="grid1" runat="server" title="Customer Phone List" width="300" connectionstring="<%$ ConnectionStrings:nwind %>" />
-
出于比较的目的,在第二个区域中的 <ZoneTemplate> 标记之间声明一个普通的日历服务器控件。因为你把控件放在 WebPartZone 控件中,所以在运行时它会变得像正常的 WebPart 控件那样运转。关于在 Web 部件应用程序中使用服务器控件的详细内容,请参考:[在 Web 部件应用程序中使用 ASP.NET 服务器控件]。标记看上去应该像下列代码一样。
<asp:calendar id="Calendar1" runat="server" style="position: relative"></asp:calendar>
-
保存并关闭页面。现在你就可以准备运行页面并测试自定义的 WebPart 控件了。页面中的完整代码看起来应该像下列代码实例一样。
<%@ Page Language="C#" %> <!-- 注册用来改变显示模式的用户控件。 --> <%@ register src="displaymodecs.ascx" tagname="displaymodecs" tagprefix="uc1" %> <!-- 注册包含自定义 WebPart 控件的命名空间。注意到并没有使用 assembly 参数,那是因为该实例使用的是动态编译。把控件的源代码保存到 App_Code 子目录中。 --> <%@ register tagprefix="aspSample" namespace="Samples.AspNet.CS.Controls" %> <!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>Untitled Page</title> </head> <body> <form id="form1" runat="server"> <div> <asp:webpartmanager id="WebPartManager1" runat="server"> </asp:webpartmanager> <uc1:displaymodecs id="Displaymodecs1" runat="server" /> <br /> <table style="width: 80%; position: relative"> <tr valign="top"> <td style="width: 40%"> <asp:webpartzone id="WebPartZone1" runat="server" style="position: relative" > <parttitlestyle font-size="14" font-names="Verdana, Arial" /> <zonetemplate> <aspSample:SmallGridWebPart id="grid1" runat="server" title="Customer Phone List" width="300" connectionstring="<%$ ConnectionStrings:nwind %>" /> </zonetemplate> </asp:webpartzone> </td> <td style="width: 40%"> <asp:webpartzone id="WebPartZone2" runat="server" style="position: relative"> <zonetemplate> <asp:calendar id="Calendar1" runat="server" style="position: relative"></asp:calendar> </zonetemplate> </asp:webpartzone> </td> </tr> </table> </div> </form> </body> </html>