C# HtmlTextWriter Use

HTML

You need to write HTML programmatically using HtmlTextWriter. This allows you to generate a list of HTML elements, such as <div> elements. You could use StringBuilder to create the HTML, but HtmlTextWriter is better. Here we look at how you can use HtmlTextWriter in the C# programming language the the System.Web.UI namespace to simplify your code.

Using HtmlTextWriter

First, the HtmlTextWriter class is found in the System.Web.UI namespace. If you are not already using ASP.NET, you will need to reference the System.Web assembly. You also need the System.IO namespace for StringWriter. HTML is a string and it is easy to generate HTML using StringBuilder. However, that method is also prone to many bugs and can result in extremely complex syntax. Here we use the HtmlTextWriter class to alleviate these problems.

~~~ Program that uses HtmlTextWriter (C#) ~~~

using System;
using System.IO;
using System.Web.UI;

class Program
{
    static string[] _words = { "Sam", "Dot", "Perls" };

    static string GetDivElements()
    {
        // Initialize StringWriter instance.
        StringWriter stringWriter = new StringWriter();

        // Put HtmlTextWriter in using block because it needs to call Dispose.
        using (HtmlTextWriter writer = new HtmlTextWriter(stringWriter))
        {
            // Loop over some strings.
            foreach (var word in _words)
            {
                // Some strings for the attributes.
                string classValue = "ClassName";
                string urlValue = "http://dotnetperls.com/";
                string imageValue = "image.jpg";

                // The important part:
                writer.AddAttribute(HtmlTextWriterAttribute.Class, classValue);
                writer.RenderBeginTag(HtmlTextWriterTag.Div); // Begin #1

                writer.AddAttribute(HtmlTextWriterAttribute.Href, urlValue);
                writer.RenderBeginTag(HtmlTextWriterTag.A); // Begin #2

                writer.AddAttribute(HtmlTextWriterAttribute.Src, imageValue);
                writer.AddAttribute(HtmlTextWriterAttribute.Width, "60");
                writer.AddAttribute(HtmlTextWriterAttribute.Height, "60");
                writer.AddAttribute(HtmlTextWriterAttribute.Alt, "");

                writer.RenderBeginTag(HtmlTextWriterTag.Img); // Begin #3
                writer.RenderEndTag(); // End #3

                writer.Write(word);

                writer.RenderEndTag(); // End #2
                writer.RenderEndTag(); // End #1
            }
        }
        // Return the result.
        return stringWriter.ToString();
    }

    static void Main()
    {
        // Demonstrate HtmlTextWriter.
        Console.WriteLine(GetDivElements());
    }
}

~~~ Output of the program (HTML) ~~~

<div class=ClassName>
        <a href=http://dotnetperls.com/>
        <img src=image.jpg width=60 height=60 alt="" />Sam</a>
</div><div class=ClassName>
        <a href=http://dotnetperls.com/>
        <img src=image.jpg width=60 height=60 alt="" />Dot</a>
</div><div class=ClassName>
        <a href=http://dotnetperls.com/>
        <img src=image.jpg width=60 height=60 alt="" />Perls</a>
</div>

Notes on the example. The new StringWriter is required for the HtmlTextWriter to write to. It is a buffer and everything that is written is written to this. The using keyword ensures that the system will Dispose of the objects properly. It is not really required but may make for more efficient code.

See StringWriter Use.

Notes on the loop. Your program will have a collection of objects it needs to write out, or read from a database. We simply use a foreach loop for this. The example loops through a string array and then uses those strings as the HTML text links.

Making tags with HtmlTextWriter

Here we look at how you need to use "RenderBegin" and "RenderEnd" methods on the HtmlTextWriter. You may recognize the Push and Pop methods on queues. Call RenderBeginTag to open a new level in the HTML with that tag. You must manually close that level of that markup with the RenderEndTag method call. RenderBeginTag and RenderEndTag must be in pairs. Here is part of the above example repeated.

// The important part:
writer.AddAttribute(HtmlTextWriterAttribute.Class, classString);
writer.RenderBeginTag(HtmlTextWriterTag.Div); // Begin #1

writer.AddAttribute(HtmlTextWriterAttribute.Href, realUrl);
writer.RenderBeginTag(HtmlTextWriterTag.A); // Begin #2

writer.AddAttribute(HtmlTextWriterAttribute.Src, imgSrc);
writer.AddAttribute(HtmlTextWriterAttribute.Width, "60");
writer.AddAttribute(HtmlTextWriterAttribute.Height, "60");
writer.AddAttribute(HtmlTextWriterAttribute.Alt, "");

writer.RenderBeginTag(HtmlTextWriterTag.Img); // Begin #3
writer.RenderEndTag(); // End #3

writer.Write(boldText);

writer.RenderEndTag(); // End #2
writer.RenderEndTag(); // End #1

Notes on the sample. It adds an attribute. Attributes in HTML are similar are used with = and quotes. Add the attribute with AddAttribute before BeginRenderTag. Look at the parts of the code that read "HtmlTextWriterAttribute.Class" and similar. These are enumerations on the specified class. You do not type the tag names in strings. That would result in typos.

The tags in the example. Every tag is started and then closed later—this is the most important part. Finally, the Write method is an instance method that writes text in between the tags in HTML.

Using tabstring parameter

In the constructor to the HtmlTextWriter, use an empty string as the second parameter. This will eliminate a lot of whitespace, and I was able to reduce the size of my pages by a small percentage this way.

See Empty String Examples.

using (HtmlTextWriter writer = new HtmlTextWriter(stringWriter,
    string.Empty))
{
    // etc.
}

Using XmlWriter for XML

Using XmlWriter is very similar to the code shown here, but the output is XML. This is useful for interoperability, whereas HtmlTextWriter is mainly useful for web pages in ASP.NET.

See XmlWriter Tutorial.

Summary

Here we saw how you can use the HtmlTextWriter class in the System.Web namespace using the C# language. Use HtmlTextWriter to write HTML instead of StringBuilder alone for the cleanest and object-oriented code. The author is not aware of any performance issues, and the markup is always nicely indented.

See HTML Articles.

© 2007-2010 Sam Allen. All rights reserved.

Dot Net Perls  Sam Allen