代码之家  ›  专栏  ›  技术社区  ›  Program.X

防止包装ASP.NET服务器控件的标记

  •  22
  • Program.X  · 技术社区  · 15 年前

    我正在编写各种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输出)方法来解决这个问题。

    4 回复  |  直到 10 年前
        1
  •  39
  •   Claudio Redi    15 年前

    这个怎么样?

        public override void RenderBeginTag(HtmlTextWriter writer)
        {
            writer.Write("");
        }
    
        public override void RenderEndTag(HtmlTextWriter writer)
        {
            writer.Write("");
        }
    
        2
  •  3
  •   Jim Bosch    13 年前

    一种更优雅的方法是使用WebControl的Contrustor(默认情况下,这是用htmltextwritertag.span调用的)

    public MyWebControl() : base(HtmlTextWriterTag.Div){}
    

    并重写renderbegintag方法以添加自定义属性或其他内容:

    public override void RenderBeginTag(HtmlTextWriter writer)
        {
            writer.AddAttribute("class", "SomeClassName");
            base.RenderBeginTag(writer);
        }
    
        3
  •  2
  •   Mike Gilmore    12 年前

    我也遇到过同样的问题。在我的例子中,我覆盖了这些方法:

    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 */ }
    

    希望这有帮助。

        4
  •  1
  •   user1447679    10 年前

    我认为公认的答案并不完全必要。我可能是错的,但render方法调用这三个:

    • 呈现区域
    • 渲染内容
    • 呈现标签

    因此,您应该能够覆盖render并手动调用renderContents:

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

    有人吗?也许我错过了什么。我知道这条线是旧的,但最近我遇到了这个问题,上面是我的解决方案。

    推荐文章