声明式和命令式创建 UserControl 实例






4.09/5 (6投票s)
本文解释了如何声明式和命令式地创建 User Control 实例。
引言
当内置的 ASP.NET 服务器控件无法满足您对某个控件的额外功能需求时,您有两种选择:
- 用户控件:用户控件是您可以放入标记和 Web 服务器控件的容器。然后,您可以将用户控件视为一个整体,并为其定义属性和方法。
- 自定义控件:自定义控件是您编写的派生自 Control 或 Web Control 的类。
用户控件比自定义控件更容易创建,因为您可以重用现有控件。ASP.NET 中的 Web 用户控件或 .ascx 文件是 ASP 中 include 文件功能的替代品。Web 用户控件派生自 System.Web.UI.UserControl
命名空间。它们可以在设计时添加到 aspx 页面,也可以在运行时以编程方式添加。但它们缺乏在设计时设置控件附带属性的支持。它们不能独立运行,需要存在于其他平台,例如 aspx 页面。即使我们尝试在 Web 浏览器中加载它,IIS 也不会提供 .ascx 类型的文件。
Using the Code
- 以声明方式创建用户控件:用户控件的声明性语法与 ASP.NET 网页的语法相似。主要区别在于,控件不包含像网页那样围绕内容的 HTML、body 和 form 元素。此外,控件使用
@Control
指令,而 ASP.NET 网页使用@Page
指令。在这里,我将创建一个简单的用户控件来显示带图像和标签控件的项目摘要。
- 创建新的 Web 应用程序。
- 在项目资源管理器中右键单击项目,然后单击“添加 - 添加新项”,并选择“Web 用户控件”项。这会将一个扩展名为 .ascx 的文件添加到项目中。该文件是用户控件用来公开其界面的文件。.ASCX 文件不能直接在浏览器中查看。它需要放在容器(例如另一个 Web 窗体)内才能查看。以下行会添加到 .ascx 文件中:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="ItemSummary.ascx.cs" Inherits="Controls_ItemSummary" ClassName="Controls_ItemSummary" %>
在上述行之后,将以下代码添加到 .ascx 文件中:
1 <table cellpadding="0" cellspacing="0" runat="server" width="100%" id="tblUC"> 2 <tr> 3 <td width="15%"> 4 <asp:Image ID="imgItem" runat="server" AlternateText="No ImageAvaliable"/> 5 </td> 6 <td> 7 <asp:Label ID="lblSummary" runat="server"/> 8 </td> 9 </tr> 10 </table>
现在打开 .ascx.cs 文件,并为控件添加属性。
1 protected override void OnPreRender(EventArgs e) 2 { 3 imgItem.ImageUrl = itemImageURL; // sets the Image 4 lblSummary.Text = itemSummary; //sets text for the summary 5 } 6 7 // to get item summary 8 9 private string itemSummary; 10 public string ItemSummary 11 { 12 get{ return itemSummary; } 13 set{ itemSummary = value; } 14 } 15 16 // to get set item image URL 17 18 private string itemImageURL; 19 public string ItemImageURL 20 { 21 get{return itemImageURL;} 22 set{itemImageURL = value; } 23 }
- 打开解决方案资源管理器,然后将用户控件拖到一个设计师视图中的 Web 页面上。这会在 aspx 文件中添加以下代码,该代码实际上在 aspx 页面上注册了该控件。
<%@ Register Src="Controls/ItemSummary.ascx" TagName="ItemSummary" TagPrefix="uc1" %>
控件在页面上注册后,您可以自由地将许多该控件的实例添加到页面中。
-
TagPrefix:指定用于控件的前缀。它类似于一个命名空间,其中多个控件可以共享一个前缀值。这就是为什么所有 ASP.NET 服务器控件都指定 asp 前缀的原因。唯一的区别是 ASP.NET 服务器控件指令是隐式的,而不是显式声明的。
-
TagName:指定控件的名称。
-
Src:控件的位置。
-
runat='server':用于以编程方式操作用户控件。否则,只有原始 HTML 会发送回浏览器。
-
- 以下代码添加到用户控件容器的 form 标记内:
<uc1:ItemSummary ID="ItemSummary1" runat="server" ItemSummary="My Summary goes here" ItemImageURL="~/App_Themes/Images/monitor.gif" />
- 以编程方式创建用户控件:我们可以像在 Web 窗体页面上以编程方式创建 ASP.Net 服务器控件一样,以编程方式创建用户控件的实例。可以通过调用包含页面的
LoadControl()
方法来创建实例。- 强类型用户控件:通过在
@Control
指令中添加ClassName
属性,用户控件被强类型化,这为用户控件分配了类名。这是必需的,因为LoadControl( )
方法的返回类型是Control
类。为此,您必须将控件转换为其类名,以便访问其属性和方法。<%@ Control Language="C#" ClassName="Controls_ItemSummary" AutoEventWireup="true" CodeFile="ItemSummary.ascx.cs" Inherits="Controls_ItemSummary" %>
- 在工作页面上注册控件:现在,第二步是在要创建其实例的页面上使用
@Reference
指令注册该控件。当您以编程方式创建用户控件时,只有在创建了对用户控件的引用后,ASP.NET Web 页面才能访问您的用户控件的强类型。例如,以下代码创建了一个对用户控件文件的引用。<%@ Reference Control="~/Controls/ItemSummary.ascx" %>
然而,当以声明方式创建用户控件的实例时,会使用
@ Register
指令。 - 创建用户控件的实例变量:现在,使用控件的类名创建一个用户控件的实例。控件类将是 ASP 命名空间的一部分。例如,如果控件的类名是
ItemSummaryControl
。protected ASP.Controls_ItemSummary ucItemSummary;
- 通过调用 LoadControl() 方法创建实例:现在,通过调用
LoadControl( )
方法创建控件的实例。LoadControl( )
方法读取文件并将其实例化为一个可以添加到页面的控件。例如:1 for (int i = 1; i < 5; i++) 2 { 3 //Load Control 4 ucItemSummary=(ASP.Controls_ItemSummary)LoadControl ("~/Controls/ItemSummary.ascx"); 5 6 //Set Control properties 7 ucItemSummary.ItemSummary = "My Control " + i.ToString(); 8 ucItemSummary.ItemImageURL = "~/App_Themes/Images/monitor.gif"; 9 10 //Break between the controls 11 phControlHolder.Controls.Add(new LiteralControl("<br/>")); 12 13 //Add Control to the Place Holder 14 phControlHolder.Controls.Add(ucItemSummary); 15 }
- 当您使用
Add
方法将控件添加到ControlCollection
对象时,它们会按照处理顺序添加到集合中。如果您想将控件添加到集合中的特定位置,请使用AddAt
方法并指定要存储控件的索引位置。
- 强类型用户控件:通过在
Web 用户控件的优点
Web 用户控件最大的优点是它们可以作为站点模板创建并在整个站点中使用。例如,可以将它们设置为包含站点的菜单/链接结构,并可以在所有其他 aspx 页面中使用。这意味着以下内容:
- 如果网站在当前布局/结构中引入新的全站链接,只需在用户控件中放置一次即可。如果 Web 用户控件在其中使用,所有页面将一次性更新。
- 如果要更正任何链接,只需在服务器端一次即可完成。
- .ascx 文件既可以用作普通 HTML 的简单替代品,也可以用于响应事件。这意味着还可以针对它们创建自定义代码并将其放入代码隐藏文件中。
缺点/劣势
尽管用户控件提供了进行站点范围修改的灵活性,但如果站点的整体结构发生变化,则所有页面的 HTML/aspx 代码都需要修改。但只要站点保持相同的布局,Web 用户控件就是维护站点通用布局的首选。
另一个缺点是它不能简单地引用以便在不同的项目中使用。如果我们想在不同的项目中使用此用户控件,则必须复制该文件并修改命名空间以匹配主机命名空间名称。
历史
- 2010 年 2 月 2 日:首次发布