在开始之前,我不询问如何从父页面访问UserControl中托管的服务器端控件。这已被多次询问过,这与此不重复。
此问题与位于UserControl实例的模板项目中的服务器端控件有关。
在ASP.NET中,我有一个带有多个模板处理程序的UserControl,这导致HTML块被呈现为每个模板的单个实例(它不像{{{ 1}}多次使用模板)。例如:
<asp:Repeater>
UserControl的设置类似于......
<uc1:MyUserControl runat="server" ID="myCtrl1">
<TopControls>
<asp:Literal runat="server" ID="litTop" />
</TopControls>
<BottomControls>
<asp:Button runat="server" id="btnBottom" />
</BottomControls>
</uc1:MyUserControl>
问题是,为了让父页面访问控件,我需要在UserControl中有一个方法来查找它们:
<div class="myUserControl">
<div class="topControls">
<asp:PlaceHolder runat="server" id="plhTopControls" />
</div>
<div class="bottomControls">
<asp:PlaceHolder runat="server" id="plhBottomControls" />
</div>
</div>
这是因为Visual Studio 2015设计器不再将两个服务器端控件视为属于该页面,而是控件属于UserControl,因此我必须在页面中专门声明它们并进行设置在Public Overrides Function FindControl(id As String) As System.Web.UI.Control
Dim ctrl As Control = Nothing
If Not TopControlsContainer Is Nothing Then
ctrl = TopControlsContainer.FindControl(id)
End If
If ctrl Is Nothing AndAlso Not BottomControlsContainer Is Nothing Then
ctrl = BottomControlsContainer.FindControl(id)
End If
If ctrl Is Nothing Then
ctrl = MyBase.FindControl(id)
End If
Return ctrl
End Function
:
Page_Load
是否可以设置UserControl,以便模板中的服务器端控件被父页面的设计器文件选取,所以我不必经历这个每次我在UserControl中添加一个新的UserControl或服务器端控件?
如果使用UserControl无法实现,是否可以使用服务器端控件执行此操作? (如果是,那需要哪些属性?)
答案 0 :(得分:2)
在MyUserControl.ascx.vb中,使用TemplateInstanceAttribute装饰ITemplate属性,并指定TemplateInstance.Single。 (默认值为Multiple。)来自文档:
模板的单个实例允许您引用模板中包含的控件。
VB.NET:
<PersistenceMode(PersistenceMode.InnerProperty)>
<TemplateInstance(TemplateInstance.Single)>
Public Property TopControls As ITemplate
<PersistenceMode(PersistenceMode.InnerProperty)>
<TemplateInstance(TemplateInstance.Single)>
Public Property BottomControls as ITemplate
C#:
[PersistenceMode(PersistenceMode.InnerProperty)]
[TemplateInstance(TemplateInstance.Single)]
public ITemplate TopControls { get; set; }
[PersistenceMode(PersistenceMode.InnerProperty)]
[TemplateInstance(TemplateInstance.Single)]
public ITemplate BottomControls { get; set; }
编译代码并重新保存父页面后,Visual Studio设计器将为模板内声明的控件生成支持字段。
注意:如果模板只实例化一次,则只应指定TemplateInstance.Single。