从父页面

时间:2017-06-29 16:22:48

标签: c# asp.net vb.net webforms user-controls

在开始之前,我询问如何从父页面访问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无法实现,是否可以使用服务器端控件执行此操作? (如果是,那需要哪些属性?)

1 个答案:

答案 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。