除了 ASP.NET 提供的内置服务器控件外,还可以使用已学会的编写 Web 窗体页的相同编程技巧轻松地定义自己的控件。实际上,只需做少量的修改,几乎任何 Web 窗体页即可在其他页中作为服务器控件重用(注意,用户控件是 System.Web.UI.UserControl 类型,该类型直接从 System.Web.UI.Control 继承)。用作服务器控件的 Web 窗体页简称为用户控件。作为约定,使用 .ascx 扩展名指示这样的控件。这样可以确保用户控件的文件不能作为独立的 Web 窗体页执行(您会略微发现在用户控件和 Web 窗体页之间有很少但很重要的差异)。用户控件通过 Register 指令包括在 Web 窗体页中。
<%@ Register TagPrefix="Acme" TagName="Message" Src="pagelet1.ascx" %>
TagPrefix 确定用户控件的唯一命名空间(以便多个同名的用户控件可以相互区分)。TagName 是用户控件的唯一名称(可以选择任何名称)。Src 属性是用户控件的虚拟路径,例如“MyPagelet.ascx”或“/MyApp/Include/MyPagelet.ascx”。注册了用户控件后,可以像放置普通的服务器控件那样,将用户控件标记放置在 Web 窗体页中(包括 runat="server" 属性):
<Acme:Message runat="server"/>
2。公开用户控件属性
当 Web 窗体页被视为控件时,该 Web 窗体的公共字段和方法也被提升为此控件的公共属性(即标记属性)和方法。
除了将公共字段提升为控件属性外,还可以使用属性语法。属性语法具有能够在设置或检索属性时执行代码的优点。
3。在用户控件中封装事件
用户控件参与请求的整个执行生存期,方式与普通的服务器控件类似。这意味着用户控件可以处理自己的事件,并封装来自包含 Web 窗体页的一些页逻辑。注意,用户控件本身不具有包装它的 <form runat="server"> 控件。由于一页上只能有一个窗体控件(ASP.NET 不允许嵌套的服务器窗体),因此需要包含 Web 窗体页负责定义该控件。
4。以编程方式创建用户控件
正如可以编程方式创建普通的服务器控件一样,也可以这样创建用户控件。页的 LoadControl 方法用于加载用户控件,并传递用户控件源文件的虚拟路径:
Control c1 = LoadControl("pagelet7.ascx");
((Pagelet7CS)c1).Category = "business";
Page.Controls.Add(c1);
用户控件的类型由 Control 指令上的 ClassName 属性决定。例如,以文件名“pagelet7.ascx”保存的用户控件被分配强类型“Pagelet7CS”,如下所示:
<%@ Control ClassName="Pagelet7CS" %>
重要说明 只有当为用户控件包括了 Register 指令时,用户控件的强类型才能由包含 Web 窗体页使用(即使没有实际声明的用户控件标记)。
小结
- 用户控件使开发人员能够使用编写 Web 窗体页的相同编程技巧轻松地定义自定义控件。
- 作为约定,用 .ascx 文件扩展名指示这样的控件。这样可以确保用户控件文件不能作为独立的 Web 窗体页执行。
- 用户控件通过 Register 指令包括在另一 Web 窗体页中,该指令指定 TagPrefix、TagName 和 Src location。
- 注册了用户控件后,可以像普通的服务器控件那样将用户控件标记放置在 Web 窗体页中(包括 runat="server" 属性)。
- 在包含 Web 窗体页中将用户控件的公共字段、属性和方法提升为该控件的公共属性(标记属性)和方法。
- 用户控件参与每个请求的整个执行生存期,并且可以处理自己的事件,封装来自包含 Web 窗体页的一些页逻辑。
- 用户控件不应包含任何窗体控件,而应依靠其包含 Web 窗体页在必要时包括窗体控件。
- 可以使用 System.Web.UI.Page 类的 LoadControl 方法以编程方式创建用户控件。用户控件的类型由 ASP.NET 运行库决定,遵循约定文件名_扩展名。
- 只有当为用户控件包括了 Register 指令时,用户控件的强类型才能由包含 Web 窗体页使用(即使没有实际声明的用户控件标记)。