我正在编写一个ASP.NET自定义复合控件(继承System.Web.UI.WebControls.CompositeControl)。
默认情况下,我的控件标记呈现为被标记包围。我知道我可以覆盖属性TagKey,以将返回设置为System.Web.UI.HtmlTextWriterTag枚举中的任何标记。
我的问题:我可以在不使用. NET添加标记的情况下呈现控件吗?
更新(3/2/2011)谢谢Swati的回答。我想展示一下我现在是如何解决我的问题的。我想我会整合Swati的一些想法。具体来说,AddAttributestoRender(),但我想知道是否需要,因为CompositeControl将缺乏一个父标记标签来保存属性。
当我不需要一个包含标记时,我会覆盖CompositeControl中的一个属性和两个方法。
Protected Overrides ReadOnly Property TagKey() As System.Web.UI.HtmlTextWriterTag
Get
' System defaults return as HtmlTextWriterTag.Span
Return HtmlTextWriterTag.Unknown
End Get
End Property
Public Overrides Sub RenderBeginTag(ByVal writer As System.Web.UI.HtmlTextWriter)
If Me.TagKey <> HtmlTextWriterTag.Unknown Then
MyBase.RenderBeginTag(writer)
End If
End Sub
Public Overrides Sub RenderEndTag(ByVal writer As System.Web.UI.HtmlTextWriter)
If Me.TagKey <> HtmlTextWriterTag.Unknown Then
MyBase.RenderBeginTag(writer)
End If
End Sub
3条答案
按热度按时间aydmsdu91#
可以用CompositeControl去掉包含标签,但这与CompositeControl喜欢的工作方式相反(见下文)。
显然,正确的方法是将TagKey设置为控件的主标记(div、table或其他标记)。
然后重写AddAttributesToRender()以设置 Package 器标记上所需的属性。
Package 标签中所需的内容应该通过重写RenderContents()方法来呈现。
CompositeControl继承自WebControl。请参阅有关TagKey和AddAttributesToRender()here用户的讨论。
有人在GeeksWithBlogs上写了一个类似的问题here。
不过,要去掉 Package ,请参见forum post,它显示了一种重写控件构造函数以及RenderBeginTag和RenderEndTag方法以删除 Package 标记的方法。
cetgtptt2#
使用RenderBeginTag。“RenderBeginTag”调用另一个方法,“AddAttributestoRender”方法,来处理所有类型的“属性”,这些属性只与开始标记相关。“TagKey”对应于默认的HTML标记,这些标记对应于Web控件。如果我们在“RenderBegintag”方法中实现自己的标记,我们可以简单地忘记“TagKey”问题。您可以这样做。
jk9hmnmh3#
你可以重写
Render()
方法,强制它只呈现内容,也许类似下面的方法就可以了: