Here I have created sample that will help you out.
Default.aspx
<div>
<h2>
Dynamic Pages</h2>
<br />
<asp:HyperLink NavigateUrl="~/AddPage.aspx" Text="Add Page" runat="server" />
<hr />
<asp:Repeater ID="rptPages" runat="server">
<HeaderTemplate>
<table>
<tr>
<th>
Pages
</th>
<th>
</th>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td>
<%# Container.ItemIndex + 1 %>
<asp:HyperLink ID="HyperLink1" NavigateUrl='<%# Eval("PageName", "~/Pages/{0}.aspx") %>'
Text='<%# Eval("Title") %>' runat="server" />
</td>
<td>
<asp:HyperLink NavigateUrl='<%#Eval("PageName","~/AddPage.aspx?PageName={0}") %>'
runat="server" Text="Edit" />
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
</div>
Code
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
this.BindPages();
}
}
private void BindPages()
{
string query = "SELECT [PageName], [Title], [Content] FROM [Pages]";
string conString = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection con = new SqlConnection(conString))
{
using (SqlCommand cmd = new SqlCommand(query))
{
using (SqlDataAdapter sda = new SqlDataAdapter())
{
cmd.Connection = con;
sda.SelectCommand = cmd;
using (DataTable dt = new DataTable())
{
sda.Fill(dt);
rptPages.DataSource = dt;
rptPages.DataBind();
}
}
}
}
}
AddPage.aspx
<div>
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
Name:
</td>
</tr>
<tr>
<td>
<asp:TextBox ID="txtPageName" runat="server" />
</td>
</tr>
<tr>
<td>
</td>
</tr>
<tr>
<td>
Title:
</td>
</tr>
<tr>
<td>
<asp:TextBox ID="txtTitle" runat="server" />
</td>
</tr>
<tr>
<td>
</td>
</tr>
<tr>
<td>
Content:
</td>
</tr>
<tr>
<td>
<asp:TextBox ID="txtContent" runat="server" TextMode="MultiLine" />
</td>
</tr>
<tr>
<td>
</td>
</tr>
<tr>
<td>
<asp:Button ID="btnSubmit" Text="Submit" runat="server" OnClick="Submit" />
</td>
</tr>
</table>
<script type="text/javascript" src="//tinymce.cachefly.net/4.0/tinymce.min.js"></script>
<script type="text/javascript">
tinymce.init({ selector: 'textarea' });
</script>
</div>
Code
private string PageName
{
get
{
return Request.QueryString["PageName"];
}
}
protected void Page_Load(object sender, EventArgs e)
{
if (!this.IsPostBack)
{
if (!string.IsNullOrEmpty(this.PageName))
{
PopulatePage();
}
}
}
protected void Submit(object sender, EventArgs e)
{
string query = string.Empty;
if (string.IsNullOrEmpty(PageName))
{
query = "INSERT INTO [Pages] VALUES (@PageName, @Title, @Content)";
}
else
{
query = "UPDATE [Pages] SET Title = @Title,Content = @Content WHERE PageName = @PageName";
}
string conString = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection con = new SqlConnection(conString))
{
using (SqlCommand cmd = new SqlCommand(query, con))
{
cmd.Parameters.AddWithValue("@PageName", txtPageName.Text.Replace(" ", "-"));
cmd.Parameters.AddWithValue("@Title", txtTitle.Text);
cmd.Parameters.AddWithValue("@Content", txtContent.Text);
con.Open();
cmd.ExecuteNonQuery();
con.Close();
Response.Redirect("~/Default.aspx");
}
}
}
private void PopulatePage()
{
string query = "SELECT [Title], [Content] FROM [Pages] WHERE [PageName] = @PageName";
string conString = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;
using (SqlConnection con = new SqlConnection(conString))
{
using (SqlCommand cmd = new SqlCommand(query))
{
using (SqlDataAdapter sda = new SqlDataAdapter())
{
cmd.Parameters.AddWithValue("@PageName", this.PageName);
cmd.Connection = con;
sda.SelectCommand = cmd;
using (DataTable dt = new DataTable())
{
sda.Fill(dt);
txtTitle.Text = dt.Rows[0]["Title"].ToString();
txtContent.Text = dt.Rows[0]["Content"].ToString();
txtPageName.Text = this.PageName;
txtPageName.Enabled = false;
}
}
}
}
}
DynamicPage.apsx,Global.asax will be the same as given in referred article.
Screenshot
