C# 用户控件与模板,更改服务器控件呈现ID

C# 用户控件与模板,更改服务器控件呈现ID,c#,asp.net,vb.net,user-controls,C#,Asp.net,Vb.net,User Controls,TL;博士… 使用一次性模板创建[UserControl]时,是否可以将make服务器端控件放置在这些模板中,以便在不使用UserControl或容器id的情况下呈现其id 在我的ASP.NET web应用程序中,我创建了一个带有多个一次性模板的UserControl(我在这里只给出了其中一个模板的代码) 当呈现为HTML时,元素的id将导致 id="ctl00_content_muc1_ctl00_btnMyButton" 。。。其中,第二个ctl00是MyUserCtrlLiteralC

TL;博士…

使用一次性模板创建
[UserControl]
时,是否可以将make服务器端控件放置在这些模板中,以便在不使用
UserControl
或容器id的情况下呈现其
id


在我的ASP.NET web应用程序中,我创建了一个带有多个一次性模板的
UserControl
(我在这里只给出了其中一个模板的代码)

呈现为HTML时,元素的
id
将导致

id="ctl00_content_muc1_ctl00_btnMyButton"
。。。其中,第二个
ctl00
MyUserCtrlLiteralContainer
实例的ID


是否有任何方法使控件的
id
呈现如下?(因此不使用容器的ID)

或者更好,是否有任何方法使控件的
id
呈现如下?(因此不使用usercontrol或容器的ID)


或者,是否有一种不同的方法来实例化
用户控件中的控件,从而导致上述两种情况?

我不相信您能够让ID看起来像您所希望的那样,因为它们是为了显示控件层次结构而设计的,尽管它们很难看

但是,如果愿意,可以在控件、页面或整个项目上使用静态ID。查看这篇来自2010年ScottGu的便利文章:


您将要查找的部分是今天更清晰的标记主题:客户端id

按钮
id
包括
muc1
ctl00
,因为UserControl和MyUserCtrlLiteralContainer实现了。如果不希望
id
包含这些部分,但确实希望
id
包含其他祖先id,则不能使用这些控件类型

删除
ctl00
除非您特别需要自定义容器控件,否则您可以删除MyUserCtrlLiteralContainer并直接在占位符中实例化模板

删除
muc1
必须将UserControl重写为不在MingContainer中实现的服务器控件

下面是一个示例实现:


公共类MyUserCtrl
继承控制权
专用plhFirst作为占位符
作为ITemplate的公共属性模板
私有子页_Init(发送者作为对象,e作为事件参数)处理MyBase.Init
plhFirst=新占位符()
控件。添加(plhFirst)
如果FirstTemplate不是空的,那么
FirstTemplate.instanceEIN(plhFirst)
如果结束
端接头
受保护的覆盖子渲染(编写器作为HtmlTextWriter)
' 
writer.AddAttribute(HtmlTextWriterAttribute.Class,“myUserCtrl”)
writer.RenderBeginTag(htmltextwittertag.Div)
' 
writer.AddAttribute(HtmlTextWriterAttribute.Class,“firstControls”)
writer.RenderBeginTag(htmltextwittertag.Div)
PLHFfirst.RenderControl(编写器)
' 
writer.renderndtag()
' 
writer.renderndtag()
端接头
末级

注意:为了避免可能的ID冲突,我故意将
plhFirst.ID
设置为未设置。

谢谢-我已经知道
clientmode
,但是正如您所说的,它不包括父结构,您可以手动伪造它,尽管这听起来一点都不有趣。您需要MyUserAlliteralContainer吗?(也就是说,您可以直接在占位符中实例化模板吗?)如果您确实需要MyUserCtrlLiteralContainer,它是否需要实现InAdminContainer?@MichaelLiu-再次感谢您的输入。您的假设是正确的,即不需要额外的
MyUserCtrlLiteralContainer
,相反,可以使用
TemplateContainer(GetType(InAdminContainer))
设置属性,并直接将其实例化到占位符中。。。这导致了
ctl00\u content\u muc1\u btnMyButton
,这是向前迈出的一大步。我觉得使用
ctl00\u content\u btnMyButton
可能有点太远了,但如果你有任何想法,那就直接说吧。同时,我建议你用你的建议创造一个答案,这样我可以给你你的信用deserve@MichaelLiu-啊,需要注意的一点是,如果您(完全偶然地)在UserControl实例中拥有一个与UserControl标记中的
同名的控件,它会抱怨重复的身份证-这是公平的再次,你是我的个人英雄-谢谢你@Michael-这恰恰解决了问题。我更希望能快速轻松地控制HTML(通过实际的标记而不是代码),但这正是我需要的。。。再次感谢:-)@freefaller:如果你有很多静态HTML,你可以调用
writer.Write(“”
,而不是AddAttribute和RenderBeginTag。想法不错-是的,也可以-再次感谢:-)
<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>
id="ctl00_content_muc1_ctl00_btnMyButton"
ctl00_content_muc1_btnMyButton
ctl00_content_btnMyButton