On the Intrepid Studios site, we use a web.sitemap file to keep a list of the static pages on the site. It's becoming more common in web design to have a page title that is a reverse-breadcrumb.

Here is a helper function that we use to generate page titles automatically based off the web.sitemap. If the page does not exist in the sitemap, it will take the title from the Page.Title attribute given in the page.

    
    public static string GeneratePageTitle(string title, 
                                           string rootTitle, 
                                           string pathSeparator)
    {

        List<string> path = new List<string>();
        SiteMapNode currentNode = null;

        currentNode = SiteMap.CurrentNode;

        if (currentNode == null)
        {
            if (String.IsNullOrEmpty(title))
            {
                return rootTitle;
            }

            return title + pathSeparator + rootTitle;
        }

        if (currentNode != SiteMap.RootNode)
        {
            if (!String.IsNullOrEmpty(title) && title != rootTitle)
            {
                path.Add(title);
            }
            else
            {
                path.Add(currentNode.Title);
            }
        }
        else
        {
            path.Add(rootTitle);
        }

        currentNode = currentNode.ParentNode;

        while (!(currentNode == null))
        {

            // Use our own root title for the <title> tag
            if (currentNode.Title != SiteMap.RootNode.Title)
            {
                path.Add(currentNode.Title);
            }
            else
            {
                path.Add(rootTitle);
            }

            currentNode = currentNode.ParentNode;
        }

        string[] paths = path.ToArray();

        return string.Join(pathSeparator, paths);

    }

You can use it like this in the code-behind, probably in your master template:

Page.Title = Helpers.GeneratePageTitle(Page.Title, "My Base Title", " | ");

In your page, make sure to set the <head> to <head runat="server"> which is what it defaults to typically anyway, otherwise .NET will not alter the title tag appropriately.

Feel free to modify it to your needs.

This function works with URL rewriting (see this blog post's title?), because you can assign the Page.Title property programmatically in the code-behind. Technically I also dynamically modify the sitemap, but that's for another day.