STORM
STORM

Reputation: 4331

How to replace a placeholder with a control in code behind?

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

Answers (2)

STORM
STORM

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

santosh singh
santosh singh

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

Related Questions