CODEDIGEST
Home » Articles
Search
 

Technologies
 

Sponsored links
 

CodeDigest Navigation
 

Technology News
No News Feeds available at this time.
 

Community News
No News Feeds available at this time.
 
Creating ASPX Page Dynamically in ASP.Net and C#

By Satheesh babu
Posted On Nov 24,2008
Article Rating:
Average Rating: 4
No of Ratings: 4
No of Comments: 33
Category: ASP.Net
Print this article.

Creating ASPX Page Dynamically in ASP.Net

 

There are situations where we need to create ASPX pages dynamically in our asp.net websites. For example, if we want to build a tutorial hosting site or a content management system that has huge static data, we can publish it as a static pages instead of putting it into database. With static pages, we can save database memory with performance improvement because of its static nature. But, this approach will be tedious if we create aspx pages manually and copy it to the server everytime for publishing new information.

 

This article will give you an idea on how to handle this scenario and create aspx dynamically.

Consider we are building an article hosting site. The pages that are hosting the article will have similar behavior i.e. it will have article content, a rating system, commenting system etc that is similar on every pages. Similar behavior means, the codebehind functionality is same for all pages. Keeping this in our mind, we will build a common codebehind class first and create the aspx markup file dynamically. We need to link the aspx page with the common codebehind class using Inherits and CodeFile attribute in @Page directive. To make the implementation simple, we will build a template aspx page with some placeholders for values. These placeholders can then be replaced with the actual values when creating aspx page dynamically. Refer the below Template ASPX page in "Template ASPX Page" section.

 

Moving forward, this article will help us to build aspx pages dynamically that have similar functionalities.

 

Creating Master Page

Our first step will be creating a MasterPage which gives common look and feel across pages. For simplicity purpose I have created a simple master page that has the logo on left hand side and a single ContentPlaceHolder for page contents.

 

<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MainMaster.master.cs" Inherits="MainMaster" %>

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

    <title>Untitled Page</title>

</head>

<body>

    <form id="form1" runat="server">

    <div>

       <table width="100%">

    <tr><td width="5%"> <h2>Your Site Logo</h2></td><td></td></tr>

    <tr><td colspan="2"><asp:Label ID="lblPageHead" runat="server"></asp:Label> </td></tr>

    <tr><td colspan="2">

<asp:contentplaceholder id="ContentPlaceHolder1" runat="server">

        </asp:contentplaceholder>

     </td></tr>

    </table>

    </div>

    </form>

</body>

</html>  

 

Our next step will be creating a template ASPX page that has the basic skeleton of the dynamic aspx pages.

 

Template ASPX Page

<%@ Page Language="C#" MasterPageFile="MainMaster.master"

CodeFileBaseClass="BasePage" AutoEventWireup="true" CodeFile="CommonCodeBehind.cs"

Inherits="CommonCodeBehind" PageID="[ID]" Title="[Title]" MetaKeywords="[key]" MetaDescription="[MetaDes]" %>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">

[PageContent]

</asp:Content>

 

If you see the above code, we are linking the codebehind class through Inherits and CodeFile attribute. There are placeholders that are defined in the template which should be replaced with actual values while creating the page. We have also defined PageID, MetaKeywords and MetaDescription custom attrbutes that is defined in BasePage class and is referenced via CodeFileBaseClass attribute. The meta keyword and description tags will be dynamically created in BasePage class based on the value set on the @Page directive.

 

Refer below for the BasePage class and common codebehind class.

 

BasePage.cs

public class BasePage : System.Web.UI.Page

{

    private string _metadescription;

    private string _metakeywords;

    private string _ID;

 

    public string MetaDescription

    {

        get

        {

            return _metadescription;

        }

        set

        {

            _metadescription = value;

        }

    }

    public string MetaKeywords

    {

        get

        {

            return _metakeywords;

        }

        set

        {

            _metakeywords = value;

        }

    }

    public string PageID

    {

        get

        {

            return _ID;

        }

        set

        {

            _ID = value;

        }

    }

 

    public BasePage()

    {

        //

        // TODO: Add constructor logic here

        //

    }

    protected override void OnLoad(EventArgs e)

    {

 

        if (!String.IsNullOrEmpty(MetaKeywords))

        {

            HtmlMeta tag = new HtmlMeta();

            tag.Name = "keywords";

            tag.Content = MetaKeywords;

            Header.Controls.Add(tag);

        }

 

        if (!String.IsNullOrEmpty(MetaDescription))

        {

            HtmlMeta tag = new HtmlMeta();

            tag.Name = "description";

            tag.Content = MetaDescription;

            Header.Controls.Add(tag);

        }

 

        base.OnLoad(e);

    }

    void Page_Error(object sender, EventArgs e)

    {

        Server.Transfer("Error.aspx");     

    }

}

 

 

CommonCodeBehind.cs

using System;

using System.Data;

using System.Configuration;

using System.Collections;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

 

public partial class CommonCodeBehind : BasePage

{

    protected void Page_Load(object sender, EventArgs e)

    {       

        (Page.Master as MainMaster).PageID = this.PageID;

    }

}




As I said earlier, the page can have some functions like rating system, commenting system etc. These functionalities can be implemented in MasterPage itself. The PageID(or a ArticleID) in @Page Directive will help us identify the article for which the comment and rating should be stored in database. We can also implement these functionalities through a user control and can include it in the master page. The title that is set on the Title attribute can be assigned to lblPageHead in MasterPage.

 

Refer the below Codebehind file of the master page for clear understanding.

 

public partial class MainMaster : System.Web.UI.MasterPage

{

    private string _pageID;

  

    public string PageID

    {

        get

        {

            return _pageID;

        }

        set

        {

            _pageID = value;

        }

    }

    protected void Page_Load(object sender, EventArgs e)

    {

        this.lblPageHead.Text =this.Page.Title;       

    }

}

 

The PageID value can be used to store the comments, ratings, etc from Master Page.

 

Dynamic ASPX Page Generation

We will build a page that accepts Title, Meta Keyword, Meta Description and Content from the user and replace it with the placeholders that are in Template.aspx page and save it as a separate aspx page. Refer the below diagram.

 

The dynamic page creation cod will be,

 

protected void btnCreate_Click(object sender, EventArgs e)

    {

            string root = Server.MapPath("~");

       //Read the Template file

            string Template = root + "\\PageTemplate.temp";           

            StringBuilder line = new StringBuilder();

            using (StreamReader rwOpenTemplate = new StreamReader(Template))

            {

                while (!rwOpenTemplate.EndOfStream)

                {

                    line.Append(rwOpenTemplate.ReadToEnd());

                }

            }

          

           int ID = 0;

           string SaveFilePath = "";

           string SaveFileName = "";

           Random ran = new Random();

           ID = ran.Next();

 

                //Page Name Creator with only URL allowed character

string Title = ID.ToString() + "-" + StripURLNotAllowedChars(txtTitle.Text);

                SaveFileName = "\\"+ Title + ".aspx";

                SaveFilePath = root + "\\Pages\\" + SaveFileName;

                 FileStream fsSave = File.Create(SaveFilePath);

                 if (line != null)

                 {     //Replace the page content              

                     line.Replace("[Title]", txtTitle.Text.Replace("<", "&lt;").Replace(">", "&gt;").Replace('"', ' ').Replace('"', ' '));                   

                     line.Replace("[PageContent]", txtContent.Text);

                     line.Replace("[MetaDes]", txtDes.Text.Replace('"', ' ').Replace('"', ' ').Replace('<', '-').Replace('>', '-') );

                     line.Replace("[key]", txtKey.Text.Replace('"', ' ').Replace('"', ' ').Replace('<', '-').Replace('>', '-'));

                     line.Replace("[ID]", ID.ToString());           

                     StreamWriter sw = null;

                     try

                     {//write content

                         sw = new StreamWriter(fsSave);

                         sw.Write(line);

                     }

                     catch (Exception ex)

                     {

                         lblMessage.Text = ex.Message;

                     }

                     finally

                     {

                         sw.Close();                        

                     }

                 }

    }

private string StripURLNotAllowedChars(string htmlString) 

string pattern = @"\s|\#|\$|\&|\||\!|\@|\%|\^|\*|\<\|\>|\\|\/|\+|\-|\="; 

return Regex.Replace(htmlString, pattern, "-"); 

 

In the above code, we are reading the template aspx markup from a file to a StringBuilder object “line”. You can choose your own way of handling this Template page i.e. you can also store in a table and retrieve it when necessary.

From the Title of the page that is typed in by the user we are creating the Page name. The Title that is inputted by user can have space and URL not allowed characters which should be replaced with a URL allowed characters like “-“. Thus, the page name itself will describe the content which is more search engine friendly. We can also append an ID which will make the page name unique and the same number can be used to identify the article/page in database to store comments, ratings, etc.

Finally, all the placeholders should be replaced with the user contents and values.

For example, [Title] with the text of “txtTitle” TextBox that is typed in by the user.

 

This approach can be used as an example and we can refine it further to fit to our need and also we can improve it further for better performance. Download the code to understand it better.

 

Deployment

If you see the Template.aspx page we are referring the codebehind class through CodeFile attribute in @Page directive which is fine when we are actually developing. This needs to be changed when we deploy so that the assembly is referred in the @Page directive. We can remove CodeFile attribute and refer the assembly through Inherits attribute. To deploy the application, we can create a single file assembly for the project and set the Inherits attribute to the assembly type. To know more about creating single file assembly, refer my article Web Deployment Plugin for Visual Studio. Refer the below sample aspx page that is created dynamically for better understanding.

 

<%@ Page Language="C#" MasterPageFile="MainMaster.master" AutoEventWireup="true"  

Inherits="CommonCodeBehind, Sample_deploy" CodeID="3" Title="Connecting to Excel sheet using Generic Data Access in ADO.Net 2.0" MetaDescription="Connecting to Excel sheet in C#, ADO.Net 2.0 and usage of Generic Data Access in ADO.Net 2.0" %>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">

<P class=MsoNormal style="MARGIN: 0in 0in 0pt">The below code can be used to fetch data from excel sheet using ADO.Net 2.0. </P>

<P class=MsoNormal style="MARGIN: 0in 0in 0pt">I have used Generic data access code to achieve this.</P>

<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p>&nbsp;</o:p></P>

<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><STRONG><U>Connect to Excel</U></STRONG></P>

<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT color=#a52a2a>public DataTable FillDtFromExcel()</FONT></P>

<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT color=#a52a2a><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>connection.ConnectionString = connectionString;</FONT></P>

<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><SPAN style="mso-tab-count: 1"><FONT color=#a52a2a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </FONT></SPAN></P>

<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT color=#a52a2a><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN><SPAN style="mso-spacerun: yes">&nbsp;</SPAN>DbCommand selectCommand = factory.CreateCommand();</FONT></P>

<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT color=#a52a2a><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>selectCommand.CommandText = query;</FONT></P>

<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT color=#a52a2a><SPAN style="mso-tab-count: 1">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>selectCommand.Connection = connection;</FONT></P>

<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><FONT color=#a52a2a><SPAN style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </SPAN>}</FONT></P>

<P class=MsoNormal style="MARGIN: 0in 0in 0pt"><o:p>&nbsp;</o:p></P>

<P class=MsoNormal style="MARGIN: 0in 0in 0pt">Replace the Excel file name in the connection string with path to use the above code! The worksheet name should be given inside the [] brackets with a $ symbol concatenated in the query([AllEmail$]).</P>

</asp:Content>

 

You can consider some of the free rich textbox controls to input the page contents.

Downloads

Source Code 

 

Conclusion

Thus, by this article we can implement dynamic page creation in asp.net. This approach can be used as an example and we can refine it further to fit to our need and also we can improve it further for better performance. Download the code to understand it better. Please post your valuable thoughts if you a find improved way or refining the above approach to create page dynamically in asp.net.

Happy Coding!!

 

 

Similar Articles
You can contribute to CodeDiget.Com:
Donate to CodeDigest.com
Article Feedback
Comments
qw
qw
qw
qw
xfhd
zdfnzdfn
fgj
jfjfj
jhh
hjbjh jh
noches
Great book
about dynamic web page
It is very good article. It can help me very well to develop a dynamic web site.
feedback
I am great person.
Great job but need help
You guys done very good job.
This article is too good and save the memory of database, but my problem is that how can i edit the page. means its title, meta description, meta keyword, and the page content.
waiting for your reply.
thanks in advance
regarding article
how to render the page after creating it dynamically , i am getting an error .
Very Usefull
Very Good Work.......
Good work
Great works

Thanks
Good Work
Hi This is good article...This is exatcly i was looking for...I saw the communication below and you were talking about to put the atricle which will be save in database as well. If you did that, please provide me the link.

I need to atricle search as well on the basis of any keyword, name of the article, by author and by category. Please guide me for that as well.

The above code is not generating the pages for me...I am using vs2010 ultimate edition, would that be problem. I am new in .net and enjoying coding, help form you guys will make this work more enjoyable.

Thank
Nerd
Not Working
I downloaded the sample code but it is not working.Can you tell me what i have to change to get it worked.
Thanks
this code is not work
hi dear,
i want to say when i create the page first time create a page,but second time not create why can u help me
RE:Comments
If you are looking for only descriptive page names, then i suggest you to use routing or url rewriting by which you can easily manage the application...This article is just to create aspx static files if in case you need to do...Storing the content in database and using routing will help you to manage your site at a long term and it is pretty easy to implement as well..
Comments
hi your artical is too good, can you sugest me when i use only [title] for name of aspx page how i can maintainoveright the files if aspx page is existing, pls help me on this

contact me on p.pinakin@gmail.com
RE:Nice Article
I dont have one now..may i will post it in coming days!!
RE:Nice Article
do you have article for that please????
RE:Nice Article
so how o you o that, can you tell me please???
RE:Nice Article
No, i am currently using database...to have more control on the contents...
Nice Article
cool article, is that mean you are not using in CodeDigest.com any data base for your articles?????????
Nice Article
I like this article. I just want to suggest that if you want more info check out http://www.seomybrand.com
Nice Article
I like this article. I just want to suggest that if you want more info check out http://www.seomybrand.com
code behind
Is this possible to create the code behind file for every aspx page dynamically ?
thankx
good
RE:reason for below help
drop a mail to admin[at]codedigest.com, we will send you the attachment.
BTW, the download in this article is also working fine..pls try again...
reason for below help
I m not able to download file
Help
Can anyone help me creating project for this feature i need this desperately.. as i m new bee i m not able to create project .. please help with this it would be veryfull and really thank full to you.. thanks in advance
Exact Help
I Really want to develop that logic. and got code from your site. I just modiffy code for genrate along with soruce code file. Thanks
Greaaaaaaaaaat
thnks boss i was exactly looking at this type of article.Thnk agin
Fantastic
Great article, very informative.
Good Article
it will help me in my project, i want to create form Dynamically