Paging long articles in ASP.NET using C#

Long articles are better broken into bite-sized chunks over several pages. With static HTML, this is easily achieved by dividing the article into logical separations and creating separate .htm files for each. Here's how to do it using C# for an article that gets posted to a database.

The Regular Expression Split() method returns a one-dimensional zero-based array containing a number of substrings, so it is perfect for this job. What I want to do is take an article (which is a string) and divide it into substrings. In order to do this, I need a delimiter, and I use <!--pagebreak-->. As I enter the article into the database, I place <!--pagebreak--> at the points I want to break the article.

Then, having extracted the article from the database, I pass it to the following static method which I have in a utility class:

public static string PageArticle(string Article)
{
  string Output;
  string ThisPage = HttpContext.Current.Request.ServerVariables["SCRIPT_NAME"];
	
  string PageNo;
  PageNo = HttpContext.Current.Request.QueryString["Page"];

  if (Article.IndexOf("<!--pagebreak-->") != -1)
  {
    string[] Pages = Regex.Split(Article, "<!--pagebreak-->");
    int TotalPages = Pages.GetUpperBound(0) + 1;
    int Counter = 1;
    int PageNumber = 1;
    if (PageNo != null)
    {
      PageNumber = System.Convert.ToInt32(PageNo);
    }
      Output = Pages[PageNumber - 1];
      Output += "<p>Go to Page ";
      while (Counter <= TotalPages)
      {
       if (Counter == PageNumber)
        {
           Output += Counter.ToString() + " ";
        }
         else
          {
            Output += "<a href=\"" + ThisPage + "?Page=" + Counter.ToString();
            Output += "\">" + Counter.ToString() + "</a> ";
          }
          Counter++;
      }
      Output += "</p>";
    }
    else
	{
      Output = Article;
    }
  return Output;
}

The method gets the current page using the HttpContext class, and then checks to see if the article being passed to it contains the delimiter. If so, the Regular Expression Split() method breaks the article into its constituent parts. The method then checks the current page's querystirng to see if there is a page number available. If not, it sets the current page to 1, as this must be the first page, and shows the first element of the array. If there is a page number, then it shows the element from the array that matches the page number.

The method then iterates from 1 to the upper bound of the array to produce the links that will provide navigation through the article. If the number being written is the same as the current page, no hyperlink is provided, otherwise the HttpContext class providesthe current file name via the Request.ServerVariables["SCRIPT_NAME"] item, so the link will point to whichever page calls the method.

If the delimiter is not present in the body of the article, the article is returned complete.

I placed the method in a class called Utils, which is put in the App_Code folder, so it is easily called when databinding thus:

<%# Utils.PageArticle(Eval("Article")) %>