防止为 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> 标记的主要内容,如果未能解决你的问题,请参考以下文章