【发布时间】:2017-12-09 14:30:27
【问题描述】:
TL;DR...
使用一次性模板创建[UserControl] 时,是否可以将服务器端控件放置在这些模板中以呈现它们的id 没有 UserControl 或容器ID?
在我的 ASP.NET Web 应用程序中,我创建了一个带有多个一次性模板的 UserControl(我在这里只给出了其中一个模板的代码)...
Public Class MyUserCtrl
Inherits System.Web.UI.UserControl
Private Class MyUserCtrlLiteralContainer
Inherits Control
Implements INamingContainer
End Class
<TemplateContainer(GetType(MyUserCtrlLiteralContainer)),
TemplateInstance(TemplateInstance.Single),
PersistenceMode(PersistenceMode.InnerProperty)>
Public Property FirstTemplate As ITemplate
Private Sub Page_Init(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Init
If FirstTemplate IsNot Nothing Then
Dim container As New MyUserCtrlLiteralContainer()
FirstTemplate.InstantiateIn(container)
plhFirst.Controls.Add(container)
End If
End Sub
End Class
(注意,plhFirst 是标记中的<asp:PlaceHolder>)
这是在页面中使用的控件示例(由Master 页面控制)...
<asp:Content runat="server" ID="content" ContentPlaceHolderID="mainContent">
<uc1:MyUserCtrl runat="server" id="muc1">
<FirstTemplate>
<asp:Button runat="server" id="btnMyButton" />
</FirstTemplate>
</uc1:MyUserCtrl>
</asp:Content>
当<asp:Button>被渲染到HTML时,元素的id会导致...
id="ctl00_content_muc1_ctl00_btnMyButton"
...其中第二个ctl00 是MyUserCtrlLiteralContainer 实例的ID。
有没有办法让控件的id呈现如下? (所以不使用容器的ID)
ctl00_content_muc1_btnMyButton
或者更好的是,有没有办法让控件的id呈现如下? (所以既不使用用户控件的ID,也不使用容器的ID)
ctl00_content_btnMyButton
或者,是否有不同的方法来实例化 UserControl 中的控件,这会导致上述任何一种情况?
【问题讨论】:
-
您需要 MyUserCtrlLiteralContainer 吗? (也就是说,您可以直接在占位符内实例化模板吗?)如果您确实需要 MyUserCtrlLiteralContainer,是否需要实现 INamingContainer?
-
@MichaelLiu - 再次感谢您的意见。您的假设是正确的,即不需要额外的
MyUserCtrlLiteralContainer,而是可以使用TemplateContainer(GetType(INamingContainer))设置属性并直接实例化到占位符中......这导致ctl00_content_muc1_btnMyButton这是向前迈出的一大步.我觉得到达ctl00_content_btnMyButton可能有点太远了,但如果你有任何想法,那就开火吧。同时,我建议您根据您的建议创建一个答案,这样我就可以给您应得的信任 -
@MichaelLiu - 啊,需要注意的一件事是,如果您(完全有机会)在 UserControl 实例中有一个与 UserControl 标记中的
<asp:PlaceHolder>同名的控件,它会抱怨重复的 ID - 这是公平的
标签: c# asp.net vb.net user-controls