Reputation: 4331
I want to enable my users to create templates with placeholders like ##CreateLink##
which should be replaced in code-behind by controls.
I know how to create controls in runtime but I have no idea how to replace the placeholder with these dynamically created controls.
How can I achieve this?
This is my .aspx code
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Literal ID="lit" runat="server" Text="This is my sample text. Here is my ##token## which should be replaced by my control in codebehind..."></asp:Literal>
</div>
</form>
</body>
</html>
And this is my codebehind:
public partial class WebForm1 : System.Web.UI.Page
{
private HyperLink lnk;
protected override void CreateChildControls()
{
base.CreateChildControls();
lnk = new HyperLink();
lnk.ID = "lnk";
lnk.NavigateUrl = "http://www.google.com";
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected override void Render(HtmlTextWriter writer)
{
base.Render(writer);
}
}
Upvotes: 0
Views: 2260
Reputation: 4331
Using another answer to guide me I worked out the following:
.aspx Markup
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication2.WebForm1" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:Literal ID="lit" runat="server" Text="This is my sample text. Here is my ##token## and my button ##button## which should be replaced by my control in codebehind..."></asp:Literal>
<p>this is a default button</p>
<asp:Button ID="btn2" runat="server" text="from asp.net" />
</div>
</form>
</body>
</html>
C# CodeBehind code
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace WebApplication2
{
public partial class WebForm1 : System.Web.UI.Page
{
private HyperLink lnk;
private Button btn;
protected override void CreateChildControls()
{
base.CreateChildControls();
lnk = new HyperLink();
lnk.ID = "lnk";
lnk.Text = "<b>Sample Link</b>";
lnk.NavigateUrl = "http://www.google.com";
btn = new Button();
btn.ID = "btn";
btn.Text = "button text";
}
protected void Page_Load(object sender, EventArgs e)
{
}
protected override void Render(HtmlTextWriter writer)
{
StringBuilder sb = new StringBuilder();
HtmlTextWriter myWriter = new HtmlTextWriter(new System.IO.StringWriter(sb, System.Globalization.CultureInfo.InvariantCulture));
base.Render(myWriter);
myWriter.Flush();
string renderedHtml = sb.ToString();
renderedHtml = renderedHtml.Replace("##token##", RenderHTML(lnk));
renderedHtml = renderedHtml.Replace("##button##", RenderHTML(btn));
writer.Write(renderedHtml);
myWriter.Close();
sb.Clear();
}
private string RenderHTML(Control ctrl)
{
StringBuilder sb = new StringBuilder();
HtmlTextWriter myWriter = new HtmlTextWriter(new System.IO.StringWriter(sb, System.Globalization.CultureInfo.InvariantCulture));
ctrl.RenderControl(myWriter);
myWriter.Close();
return sb.ToString();
}
}
}
Upvotes: 3
Reputation: 28652
Use Render method
protected override void Render(HtmlTextWriter writer)
{
//Place replace logic
}
Update
protected override void Render(HtmlTextWriter writer)
{
MemoryStream stream = new MemoryStream();
StreamWriter memWriter = new StreamWriter(stream);
HtmlTextWriter myWriter = new HtmlTextWriter(memWriter);
base.Render(myWriter);
myWriter.Flush();
stream.Position = 0;
string renderedHtml = new StreamReader(stream).ReadToEnd();
renderedHtml = renderedHtml.Replace("##token##", "VALUE");
writer.Write(renderedHtml);
writer.Close();
myWriter.Close();
stream.Close();
}
Upvotes: 1