This is because the WebControl's constructor sets HtmlTextWriterTag.Span as the default begin tag:
protected WebControl() : this(HtmlTextWriterTag.Span) { }
Fixing the issue
To fix this, all you need to do is override the Render method in your Control class , as follows:protected override void Render(HtmlTextWriter writer) { RenderContents(writer); }
That way, you will be suppressing the outer span tag from being rendered.
Further Explanation
The following is the implementation of the Render method inside the WebControl class:protected internal override void Render(HtmlTextWriter writer) { this.RenderBeginTag(writer); this.RenderContents(writer); this.RenderEndTag(writer); }
As you can see, it's calling the RenderBeginTag method of the same WebControl class:
public virtual void RenderBeginTag(HtmlTextWriter writer) { this.AddAttributesToRender(writer); HtmlTextWriterTag tagKey = this.TagKey; if (tagKey != HtmlTextWriterTag.Unknown) { writer.RenderBeginTag(tagKey); } else { writer.RenderBeginTag(this.TagName); } }
The RenderBeginTag is rendering tagKey, which is set in the constructor we saw earlier on:
private HtmlTextWriterTag tagKey; protected WebControl() : this(HtmlTextWriterTag.Span) { } public WebControl(HtmlTextWriterTag tag) { this.tagKey = tag; }
Therefore, by overriding the Render method in our WebControl subclass to only call the RenderContents method, we will be bypassing the following methods that render the span tag: RenderBeginTag and RenderEndTag.
protected override void Render(HtmlTextWriter writer) { RenderContents(writer); /* instead of: Render(HtmlTextWriter writer) { this.RenderBeginTag(writer); this.RenderContents(writer); this.RenderEndTag(writer); } */ }