【问题标题】:Prevent wrapping <span> tags for ASP.NET server control防止为 ASP.NET 服务器控件包装 <span> 标记
【发布时间】: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) 方法解决这个问题。

【问题讨论】:

    标签: asp.net servercontrols


    【解决方案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 控件。我该怎么做?
      猜你喜欢
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      • 2014-07-28
      • 2011-01-18
      相关资源
      最近更新 更多