📄 webpagelets.aspx
字号:
<%@ Register TagPrefix="Acme" Namespace="Acme" Assembly="QSTools" %> <%@ Register TagPrefix="Acme" TagName="SourceRef" Src="/quickstart/aspplus/util/SrcRef.ascx"%>
<!-- #include virtual="/quickstart/aspplus/include/header.inc" -->
<h4>Web 窗体用户控件</h4>
<p>
<div class="indent" style="font-family:Verdana; font-size:8pt;">
<b> <img align="middle" src="/quickstart/images/bullet.gif"> </b><a class="toc2" href="#intro">用户控件介绍</a><br>
<b> <img align="middle" src="/quickstart/images/bullet.gif"> </b><a class="toc2" href="#properties">公开用户控件属性</a><br>
<b> <img align="middle" src="/quickstart/images/bullet.gif"> </b><a class="toc2" href="#events">在用户控件中封装事件</a><br>
<b> <img align="middle" src="/quickstart/images/bullet.gif"> </b><a class="toc2" href="#program">以编程方式创建用户控件</a><br>
<b> <img align="middle" src="/quickstart/images/bullet.gif"> </b><a class="toc2" href="#summary">本节小结</a><br>
</div>
<p>
<hr>
<!--BEGIN SECTION--> <a name="intro"><span class="subhead">用户控件介绍</span>
<p>
除了 ASP.NET 提供的内置服务器控件外,还可以使用已学会的编写 Web 窗体页的相同编程技巧轻松地定义自己的控件。实际上,只需做少量的修改,几乎任何 Web 窗体页即可在其他页中作为服务器控件重用(注意,用户控件是 <b>System.Web.UI.UserControl</b> 类型,该类型直接从 <b>System.Web.UI.Control</b> 继承)。用作服务器控件的 Web 窗体页简称为用户控件。作为约定,使用 .ascx 扩展名指示这样的控件。这样可以确保用户控件的文件不能作为独立的 Web 窗体页执行(您会略微发现在用户控件和 Web 窗体页之间有很少但很重要的差异)。用户控件通过 <b>Register</b> 指令包括在 Web 窗体页中。
<div class="code"><pre>
<%@ Register TagPrefix="Acme" TagName="Message" Src="pagelet1.ascx" %>
</pre></div>
<p>
<b>TagPrefix</b> 确定用户控件的唯一命名空间(以便多个同名的用户控件可以相互区分)。<b>TagName</b> 是用户控件的唯一名称(可以选择任何名称)。<b>Src</b> 属性是用户控件的虚拟路径,例如“MyPagelet.ascx”或“/MyApp/Include/MyPagelet.ascx”。注册了用户控件后,可以像放置普通的服务器控件那样,将用户控件标记放置在 Web 窗体页中(包括 <b>runat="server"</b> 属性):
<p>
<div class="code"><pre>
<Acme:Message runat="server"/>
</pre></div>
<p>
下面的示例显示导入到另一 Web 窗体页中的用户控件。注意,本例中的用户控件只是一个简单的静态文件。
<p>
<Acme:LangSwitch runat="server">
<CsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/pagelets/CS/Pagelet1.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/pagelets/Pagelet1.src"
Icon="/quickstart/aspplus/images/pagelet1.gif"
Caption="C# Pagelet1.aspx"
runat="server" />
</CsTemplate>
<VbTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/pagelets/VB/Pagelet1.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/pagelets/Pagelet1.src"
Icon="/quickstart/aspplus/images/pagelet1.gif"
Caption="VB Pagelet1.aspx"
runat="server" />
</VbTemplate>
<JsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/pagelets/JS/Pagelet1.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/pagelets/Pagelet1.src"
Icon="/quickstart/aspplus/images/pagelet1.gif"
Caption="JScript Pagelet1.aspx"
runat="server" />
</JsTemplate>
</Acme:LangSwitch>
<!--BEGIN SECTION--> <br> <a name="properties"><br> <span class="subhead">公开用户控件属性</span>
<p>
当 Web 窗体页被视为控件时,该 Web 窗体的公共字段和方法也被提升为此控件的公共属性(即标记属性)和方法。下面的示例显示前一用户控件示例的扩展,添加了两个公共 <b>String</b> 字段。注意,这些字段可以在包含页中以声明方式或编程方式设置。
<p>
<Acme:LangSwitch runat="server">
<CsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/pagelets/CS/Pagelet2.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/pagelets/Pagelet2.src"
Icon="/quickstart/aspplus/images/pagelet2.gif"
Caption="C# Pagelet2.aspx"
runat="server" />
</CsTemplate>
<VbTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/pagelets/VB/Pagelet2.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/pagelets/Pagelet2.src"
Icon="/quickstart/aspplus/images/pagelet2.gif"
Caption="VB Pagelet2.aspx"
runat="server" />
</VbTemplate>
<JsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/pagelets/JS/Pagelet2.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/pagelets/Pagelet2.src"
Icon="/quickstart/aspplus/images/pagelet2.gif"
Caption="JScript Pagelet2.aspx"
runat="server" />
</JsTemplate>
</Acme:LangSwitch>
<p>
除了将公共字段提升为控件属性外,还可以使用属性语法。属性语法具有能够在设置或检索属性时执行代码的优点。下面的示例说明一个 <b>Address</b> 用户控件,该控件在内部包装了 <b>TextBox</b> 控件的文本属性。这样做的优点是控件可以无偿继承 <b>TextBox</b> 控件的自动状态管理功能。
<p>
注意,在包含 Web 窗体的页上有两个 <b>Address</b> 用户控件,它们分别将 <b>Caption</b> 属性设置为“Billing Address”和“Shipping Address”。用户控件的真正威力在于这种可重用性。
<p>
<Acme:LangSwitch runat="server">
<CsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/pagelets/CS/Pagelet3.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/pagelets/Pagelet3.src"
Icon="/quickstart/aspplus/images/pagelet3.gif"
Caption="C# Pagelet3.aspx"
runat="server" />
</CsTemplate>
<VbTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/pagelets/VB/Pagelet3.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/pagelets/Pagelet3.src"
Icon="/quickstart/aspplus/images/pagelet3.gif"
Caption="VB Pagelet3.aspx"
runat="server" />
</VbTemplate>
<JsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/pagelets/JS/Pagelet3.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/pagelets/Pagelet3.src"
Icon="/quickstart/aspplus/images/pagelet3.gif"
Caption="JScript Pagelet3.aspx"
runat="server" />
</JsTemplate>
</Acme:LangSwitch>
<p>
另一个有用的用户控件是用于收集用户名和密码的 <b>Login</b> 控件。
<p>
<Acme:LangSwitch runat="server">
<CsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/pagelets/CS/Pagelet4.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/pagelets/Pagelet4.src"
Icon="/quickstart/aspplus/images/pagelet4.gif"
Caption="C# Pagelet4.aspx"
runat="server" />
</CsTemplate>
<VbTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/pagelets/VB/Pagelet4.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/pagelets/Pagelet4.src"
Icon="/quickstart/aspplus/images/pagelet4.gif"
Caption="VB Pagelet4.aspx"
runat="server" />
</VbTemplate>
<JsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/pagelets/JS/Pagelet4.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/pagelets/Pagelet4.src"
Icon="/quickstart/aspplus/images/pagelet4.gif"
Caption="JScript Pagelet4.aspx"
runat="server" />
</JsTemplate>
</Acme:LangSwitch>
<p>
在该示例中,窗体验证控件被添加到 <b>Login</b> 用户控件。
<p>
<Acme:LangSwitch runat="server">
<CsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/pagelets/CS/Pagelet5.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/pagelets/Pagelet5.src"
Icon="/quickstart/aspplus/images/pagelet5.gif"
Caption="C# Pagelet5.aspx"
runat="server" />
</CsTemplate>
<VbTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/pagelets/VB/Pagelet5.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/pagelets/Pagelet5.src"
Icon="/quickstart/aspplus/images/pagelet5.gif"
Caption="VB Pagelet5.aspx"
runat="server" />
</VbTemplate>
<JsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/pagelets/JS/Pagelet5.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/pagelets/Pagelet5.src"
Icon="/quickstart/aspplus/images/pagelet5.gif"
Caption="JScript Pagelet5.aspx"
runat="server" />
</JsTemplate>
</Acme:LangSwitch>
<!--BEGIN SECTION--> <br> <a name="events"><br> <span class="subhead">在用户控件中封装事件</span>
<p>
用户控件参与请求的整个执行生存期,方式与普通的服务器控件类似。这意味着用户控件可以处理自己的事件,并封装来自包含 Web 窗体页的一些页逻辑。下面的示例说明一个在内部处理自己的回发的产品清单用户控件。注意,用户控件本身不具有包装它的 <b><form runat="server"></b> 控件。由于一页上只能有一个窗体控件(ASP.NET 不允许嵌套的服务器窗体),因此需要包含 Web 窗体页负责定义该控件。
<p>
<Acme:LangSwitch runat="server">
<CsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/pagelets/CS/Pagelet6.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/pagelets/Pagelet6.src"
Icon="/quickstart/aspplus/images/pagelet6.gif"
Caption="C# Pagelet6.aspx"
runat="server" />
</CsTemplate>
<VbTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/pagelets/VB/Pagelet6.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/pagelets/Pagelet6.src"
Icon="/quickstart/aspplus/images/pagelet6.gif"
Caption="VB Pagelet6.aspx"
runat="server" />
</VbTemplate>
<JsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/pagelets/JS/Pagelet6.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/pagelets/Pagelet6.src"
Icon="/quickstart/aspplus/images/pagelet6.gif"
Caption="JScript Pagelet6.aspx"
runat="server" />
</JsTemplate>
</Acme:LangSwitch>
<!--BEGIN SECTION--> <br> <a name="program"><br> <span class="subhead">以编程方式创建用户控件</span>
<p>
正如可以编程方式创建普通的服务器控件一样,也可以这样创建用户控件。页的 <b>LoadControl</b> 方法用于加载用户控件,并传递用户控件源文件的虚拟路径: <p>
<p><Acme:TabControl runat="server">
<Tab Name="C#">
Control c1 = LoadControl("pagelet7.ascx");
((Pagelet7CS)c1).Category = "business";
Page.Controls.Add(c1);
</Tab>
<Tab Name="VB">
Dim c1 As Control = LoadControl("pagelet7.ascx")
CType(c1, (Pagelet7VB)).Category = "business"
Page.Controls.Add(c1)
</Tab>
<Tab Name="JScript">
var c1:Control = LoadControl("pagelet7.ascx");
(Pagelet7JS(c1)).Category = "business";
Page.Controls.Add(c1);
</Tab>
</Acme:TabControl><p>
用户控件的类型由 <b>Control</b> 指令上的 <b>ClassName</b> 属性决定。例如,以文件名“pagelet7.ascx”保存的用户控件被分配强类型“Pagelet7CS”,如下所示:
<div class="code"><pre>
<%@ Control ClassName="Pagelet7CS" %>
</pre></div>
<p>
由于 <b>LoadControl</b> 方法返回 <b>System.Web.UI.Control</b> 类型,因此必须将其转换为适当的强类型以便设置控件的各属性。最后,用户控件被添加到基页的 <b>ControlCollection</b>。
<p>
<Acme:LangSwitch runat="server">
<CsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/pagelets/CS/Pagelet7.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/pagelets/Pagelet7.src"
Icon="/quickstart/aspplus/images/pagelet7.gif"
Caption="C# Pagelet7.aspx"
runat="server" />
</CsTemplate>
<VbTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/pagelets/VB/Pagelet7.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/pagelets/Pagelet7.src"
Icon="/quickstart/aspplus/images/pagelet7.gif"
Caption="VB Pagelet7.aspx"
runat="server" />
</VbTemplate>
<JsTemplate>
<Acme:SourceRef
RunSample="/quickstart/aspplus/samples/webforms/pagelets/JS/Pagelet7.aspx"
ViewSource="/quickstart/aspplus/samples/webforms/pagelets/Pagelet7.src"
Icon="/quickstart/aspplus/images/pagelet7.gif"
Caption="JScript Pagelet7.aspx"
runat="server" />
</JsTemplate>
</Acme:LangSwitch>
<p>
<b>重要说明</b> 只有当为用户控件包括了 <b>Register</b> 指令时,用户控件的强类型才能由包含 Web 窗体页使用(即使没有实际声明的用户控件标记)。
<!--BEGIN SECTION--> <a name="endofsection">
<h4><a name="summary">本节小结</a></h4>
<ol>
<li>用户控件使开发人员能够使用编写 Web 窗体页的相同编程技巧轻松地定义自定义控件。
<li>作为约定,用 .ascx 文件扩展名指示这样的控件。这样可以确保用户控件文件不能作为独立的 Web 窗体页执行。
<li>用户控件通过 <b>Register</b> 指令包括在另一 Web 窗体页中,该指令指定 <b>TagPrefix</b>、<b>TagName</b> 和 <b>Src location</b>。
<li>注册了用户控件后,可以像普通的服务器控件那样将用户控件标记放置在 Web 窗体页中(包括 <b>runat="server"</b> 属性)。
<li>在包含 Web 窗体页中将用户控件的公共字段、属性和方法提升为该控件的公共属性(标记属性)和方法。
<li>用户控件参与每个请求的整个执行生存期,并且可以处理自己的事件,封装来自包含 Web 窗体页的一些页逻辑。
<li>用户控件不应包含任何窗体控件,而应依靠其包含 Web 窗体页在必要时包括窗体控件。
<li>可以使用 <b>System.Web.UI.Page</b> 类的 <b>LoadControl</b> 方法以编程方式创建用户控件。用户控件的类型由 ASP.NET 运行库决定,遵循约定<i>文件名</i>_<i>扩展名</i>。
<li>只有当为用户控件包括了 <b>Register</b> 指令时,用户控件的强类型才能由包含 Web 窗体页使用(即使没有实际声明的用户控件标记)。
</ol>
<p>
<!-- #include virtual="/quickstart/aspplus/include/footer.inc" -->
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -