我正在编写一个ASP.NET自定义复合控件(Inherits System.Web.UI.WebControls.CompositeControl)。
默认情况下,我的控件标记渲染由标记包围。我知道我可以过度使用属性TagKey将返回值设置为System.Web.UI.HtmlTextWriterTag枚举中我想要的任何标记。
我的问题:我可以在没有.NET添加标记的情况下进行控制渲染吗?
更新(2011年3月2日)感谢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
答案 0 :(得分:2)
可以使用CompositeControl去除contains标签,但它与CompositeControl喜欢的方式相反(见下文)
显然,正确的方法是将TagKey设置为控件的主要标签(div,table或其他)。
然后重写AddAttributesToRender()以在包装器标记上设置所需的属性。
应该通过覆盖RenderContents()方法来呈现包装标签内的内容。
CompositeControl继承自WebControl,请参阅TagKey和AddAttributesToRender()here.
用户的讨论GeeksWithBlogs上有人写过类似的问题here
为了摆脱包装,请参阅此forum post,它显示了一种覆盖控件构造函数的方法,以及RenderBeginTag和RenderEndTag方法,用于删除包装标记。
答案 1 :(得分:1)
使用RenderBeginTag。“RenderBeginTag”调用另一种方法,即“AddAttributestoRender”方法,以处理仅与开始标记相关的所有类型的“属性”。 “TagKey”对应于与Web控件对应的默认HTML标记。如果我们在“RenderBegintag”方法中实现我们自己的标签,我们可以简单地忘记“TagKey”问题。你可以这样做..
Public virtual void RenderBeginTag(HtmlTextWriter Writer)
{
AddAttributestoRender(writer);
HtmlTextWriterTag tagKey = TagKey;
If(tagKey != HtmlTextWriterTag.Unknown)
Writer.RenderBeginTag(tagKey);
Else
Writer.RenderBeginTag(this.tagName);
}
答案 2 :(得分:0)
难道你不能只覆盖Render()
方法,强制它只渲染内容吗?也许这样的事情可以解决问题:
public override void Render(HtmlTextWriter writer)
{
RenderContents(writer);
}