防止为 ASP.NET 服务器控件包装 <span> 标记

Posted

技术标签:

【中文标题】防止为 ASP.NET 服务器控件包装 <span> 标记【英文标题】:Prevent wrapping <span> tags for ASP.NET server control 【发布时间】:2011-04-19 10:28:33 【问题描述】:

我正在编写各种 ASP.NET 服务器控件,并且需要删除默认情况下包装我的控件的标签。我知道您可以将标签更改为不同的标签(如这个问题,How Do I Change the render behavior of my custom control from being a span),但您如何防止它呢?

我是从 WebControl 继承的(也可以从 CompositeControl 继承)。

我通常会得到:

<span>Control output</span>

我需要:

Control output

我正在覆盖 RenderContents(htmlTextWriter 输出) 和 CreateChildControls() 方法(跨各种控件)。我的当务之急是使用 RenderContents(HtmlTextWriter output) 方法解决这个问题。

【问题讨论】:

【参考方案1】:

我认为接受的答案不是完全必要的。我可能是错的,但渲染方法调用了所有三个:

RenderBeginTag 渲染内容 RenderEndTag

所以你应该能够覆盖渲染并手动调用 RenderContents:

protected override void Render(HtmlTextWriter writer)
 
    this.RenderContents(writer);

有人吗?也许我错过了一些东西。我知道这个帖子很旧,但我最近遇到了这个问题,上面是我的解决方案。

【讨论】:

【参考方案2】:

我遇到了同样的问题。就我而言,我正在覆盖这些方法:

protected override void OnPreRender(EventArgs e)
     /* Insert the control's stylesheet on the page */ 

protected override void RenderContents(HtmlTextWriter output)
         /* Control rendering here, <span> tag will show up */ 

为了防止这种情况,我简单地将 RenderContents 替换为以下内容:

protected override void Render(HtmlTextWriter output)
         /* Control rendering, no <span> tag */ 

希望这会有所帮助。

【讨论】:

使用 Render 而不是 RenderContents 对我有用。这样,RenderBeginTag/RenderEndTag 永远不会被实际调用【参考方案3】:

一个更优雅的方法是使用 WebControl 的委托者(默认情况下,这是使用 HtmlTextWriterTag.Span 调用的)

public MyWebControl() : base(HtmlTextWriterTag.Div)

并覆盖 RenderBeginTag 方法以添加自定义属性或其他内容:

public override void RenderBeginTag(HtmlTextWriter writer)
    
        writer.AddAttribute("class", "SomeClassName");
        base.RenderBeginTag(writer);
    

【讨论】:

这并不能解决问题。虽然这将允许您将跨度更改为不同的元素,例如示例中给出的 div,但它不允许您按照要求完全删除外部元素。您可以将HtmlTextWriterTag.Unknown 或一个空字符串传递给对base() 的调用,但是虽然这会删除元素的名称,但仍保留元素的尖括号,因此您最终会得到无效的标记:@987654325 @.【参考方案4】:

这个呢?

    public override void RenderBeginTag(HtmlTextWriter writer)
    
        writer.Write("");
    

    public override void RenderEndTag(HtmlTextWriter writer)
    
        writer.Write("");
    

【讨论】:

绝妙的解决方案 :) 我实际上对两者都使用了一个空方法,只是在注释行中解释了它们存在的原因。不确定这是否与您的不同,但让它写一个空白字符串似乎没有必要。 这对我帮助很大 - 在我找到您的完美解决方案之前,我必须阅读很多“好技巧”。如果可能的话,会给你一个以上的支持 g 我正在尝试删除 System.Web.UI.Web.Controls.Checkbox 周围的跨度。如果我从该类继承,则此方法有效,但是,CssClass 值不会应用于呈现的 CheckBox 控件。我该怎么做?

以上是关于防止为 ASP.NET 服务器控件包装 <span> 标记的主要内容,如果未能解决你的问题,请参考以下文章

如何强制 asp.net GridView 控件将第一行包装在 <thead> </thead> 标签内

如何防止在asp.net中注册用户重定向

ASP.NET 验证控件与防止按钮连按两次送出

如何在ASP.net中调用webservice里的一个方法

ASP.NET 服务器控件属性属性必须是必需的

如何在 reportviewer 控件上从 asp.net 调用打印?