Property TagKey()没什么

时间:2009-08-19 22:59:11

标签: asp.net custom-controls

我正在编写一个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

3 个答案:

答案 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);
}