ASP.NET Formatted String Control

Back to ASP.NET Web Forms land! SharePoint includes a handy control, FormattedString, that can be used to render the contents of its child controls as specified in a format string; pretty much what String.Format does. I wanted to do the same with plain old ASP.NET Web Forms, and here’s what I came up with:




public class FormattedControl : Control


    public String FormatString { get; set; }


    protected override void RenderChildren(HtmlTextWriter writer)


        if (String.IsNullOrWhiteSpace(this.FormatString) == false)


            var list = new List<String>();

            var builder = new StringBuilder();

            var sw = new StringWriter(builder);

            var hw = new HtmlTextWriter(sw);


            foreach (var control in this.Controls.OfType<Control>())









            writer.Write(this.FormatString, list.ToArray());









public class FormattedControlControlBuilder : ControlBuilder


    public override Boolean AllowWhitespaceLiterals()


        return false;



Key points are:

  • FormattedControl will not render as default, instead, it will capture the output of all of its child controls into a list and pass it as a parameter to the FormatString string, as {0}, {1}, etc;
  • ParseChildrenAttribute and PersisteChildrenAttribute are used to tell ASP.NET how to treat the controls declared inside FormattedControl;
  • The ControlBuilderAttribute is used to declare a custom control builder; this custom builder just tells ASP.NET to ignore whitespaces inside the control’s tag, otherwise, we would get a LiteralControl for each tab / space / return character present inside the FormattedControl’s tag, together with those controls explicitly declared.

An example:

<my:FormattedControl runat="server" FormatString="{1}, {0}!">

    <asp:Literal runat="server" Text="World"/>

    <asp:Literal runat="server" Text="Hello"/>


Of course, you should only use FormattedControl with controls that return string literals, otherwise, you will probably get a lot of garbage in the output.

Published by

Ricardo Peres

Tech Lead at RedLight Software.

Leave a Reply

Your email address will not be published. Required fields are marked *