【问题标题】:Nothing from Property TagKey()属性 TagKey() 中没有任何内容
【发布时间】:2022-01-27 07:51:12
【问题描述】:

我正在编写一个 ASP.NET 自定义复合控件(继承 System.Web.UI.WebControls.CompositeControl)。

默认情况下,我的控件标记呈现被标签包围。我知道我可以覆盖属性 TagKey 以将返回设置为我想要的 System.Web.UI.HtmlTextWriterTag 枚举中的任何标签。

我的问题:我可以在没有 .NET 的情况下渲染我的控件吗?


更新(2011 年 3 月 2 日)感谢斯瓦蒂的回答。我想展示我现在是如何解决我的问题的。我想我会整合斯瓦蒂的一些想法。具体来说,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

【问题讨论】:

    标签: asp.net custom-controls


    【解决方案1】:

    使用 CompositeControl 摆脱包含标签是可能的,但它与 CompositeControl 喜欢的工作方式背道而驰(见下文)。

    显然,正确的方法是将 TagKey 设置为控件的实际主标记(div、表格或其他)。

    然后覆盖 AddAttributesToRender() 以在包装标签上设置所需的属性。

    你想要在包装标签中的东西应该通过覆盖 RenderContents() 方法来呈现。

    CompositeControl 继承自 WebControl。请参阅 TagKey 和 AddAttributesToRender() here 的用户的讨论。

    GeeksWithBlogs 上有人写过类似的问题 here

    要摆脱包装,请参阅forum post,它显示了一种覆盖控件构造函数以及 RenderBeginTag 和 RenderEndTag 方法以删除包装标签的方法。

    【讨论】:

    • 要点:它与 CompositeControl 喜欢的工作方式背道而驰 我不得不说非常感谢 codeulike 指出 AddAttributesToRender()。我一直想念那个。这个金块超级有用。其他作家的注意事项 - 从这篇文章中学习。答案包括很大的帮助和支持链接!非常有帮助
    • 第二个链接(实际上)已损坏。它重定向到 Geekswithblogs.net, the End of an Era.
    【解决方案2】:

    利用 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);
    }
    
    

    【讨论】:

    • 说得很好。我喜欢 Stack Overflow 如何为非常古老的问题带来全新的观点。感谢您抽出宝贵时间分享。
    • 这是什么?它真的编译了吗?它看起来像是 C# 和 VB.NET(大写“Public”、“If”和“Else”)的混合体。
    • writer的大小写与参数Writer不匹配。
    • 不应该AddAttributestoRenderAddAttributesToRender
    【解决方案3】:

    你可以重写Render() 方法,强制它只渲染内容。也许这样的事情可以解决问题:

    public override void Render(HtmlTextWriter writer)
    {
        RenderContents(writer);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-02
      • 2021-02-06
      • 2018-12-12
      • 2016-04-01
      • 2014-09-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多