1

Is it possible to use the content of a ContentPlaceHolder in multiple places in a master page?

For example, I often want to do something like:

<html>
 <head>
  <title><asp:ContentPlaceHolder ID="TitleContent" runat="server" /></title>
  <link rel="Stylesheet" href="../../Content/Corporate.css" />
 </head>
 <body>
  <div id="header">
   <h1>I'd like to reuse the TitleContent ContentPlaceHolder content here?</h1>
  </div>
  <div id="content">
   <asp:ContentPlaceHolder ID="MainContent" runat="server" />
  </div>
  <div id="footer">
   &copy; 2012 Acme corp.
  </div>
 </body>
</html>
Rowland Shaw
  • 37,700
  • 14
  • 97
  • 166

1 Answers1

1

Answer is here, so please reward author, but to adjust it to MVC, here is what you need to do:

First: Define your own master page class (Site.Master):

<%@ Master Language="C#" Inherits="MyProject.Views.Shared.MyMasterPage" %>

Second: Class content:

public class MyMasterPage : ViewMasterPage
{
    protected override void RenderChildren(HtmlTextWriter writer)
    {
        var mainPlaceHolder = FindControl("TitleContent");
        var doublePlaceHolder = FindControl("TitleContentDuplicated");

        var sb = new StringBuilder();

        using (var sw = new StringWriter(sb))
        using (var tw = new HtmlTextWriter(sw))
        {
            mainPlaceHolder.RenderControl(tw);
        }

        var lc = new LiteralControl(sb.ToString());
        doublePlaceHolder.Controls.Add(lc);

        base.RenderChildren(writer);
    }
}

Third: Then you can use:

<title>
    <asp:ContentPlaceHolder ID="TitleContent" runat="server" />
    <asp:ContentPlaceHolder ID="TitleContentDuplicated" runat="server" />
</title>
Community
  • 1
  • 1
LukLed
  • 31,452
  • 17
  • 82
  • 107