Narazil jsem na zajímavý bug v ASP.NET 2.0 (2.0.50727)…
Pokud v ContentPlaceHolderu definujeme default obsah a použijeme v něm ebedded code block (starý vnořený ASP-style blok kódu <% %>, ale i <%= %>), pak ASP.NET ignoruje Content definovaný v konkrétních stránkách a stále zobrazuje pouze default obsah z MasterPage.
...
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
<% %> <-- už tohle vadí
<%= "Tohle taky vadí" %>
<%= ResolveUrl("~/takhle-na-to-asi-narazime/") %>
</asp:ContentPlaceHolder>
...
Zajímalo mě, kde je pravděpodobná příčina problému, takže jsem se díval, co z toho ASP.NET stvoří a jak se to liší od funkční podoby. Zásadní rozdíl je už v metodě __BuildControl, kde narozdíl od korektní podoby (ContentPlaceHolder1 s jedním Labelem):
private ContentPlaceHolder __BuildControlContentPlaceHolder1()
{
ContentPlaceHolder holder1 = new ContentPlaceHolder();
this.ContentPlaceHolder1 = holder1;
holder1.ID = "ContentPlaceHolder1";
if (base.ContentTemplates != null)
{
this.__Template_ContentPlaceHolder1 = (ITemplate) base.ContentTemplates["ContentPlaceHolder1"];
}
if (this.__Template_ContentPlaceHolder1 != null)
{
this.__Template_ContentPlaceHolder1.InstantiateIn(holder1);
return holder1;
}
IParserAccessor accessor1 = holder1;
accessor1.AddParsedSubObject(new LiteralControl("\r\n\t\t\t"));
Label label1 = this.__BuildControlTest();
accessor1.AddParsedSubObject(label1);
accessor1.AddParsedSubObject(new LiteralControl("\r\n "));
return holder1;
}
…chybí řádek return holder1;
private ContentPlaceHolder __BuildControlContentPlaceHolder1()
{
ContentPlaceHolder holder1 = new ContentPlaceHolder();
this.ContentPlaceHolder1 = holder1;
holder1.ID = "ContentPlaceHolder1";
if (base.ContentTemplates != null)
{
this.__Template_ContentPlaceHolder1 = (ITemplate) base.ContentTemplates["ContentPlaceHolder1"];
}
if (this.__Template_ContentPlaceHolder1 != null)
{
this.__Template_ContentPlaceHolder1.InstantiateIn(holder1);
// return holder1; <-- pravděpodobně chybí
}
holder1.SetRenderMethodDelegate(new RenderMethod(this.__RenderContentPlaceHolder1));
return holder1;
}
private void __RenderContentPlaceHolder1(HtmlTextWriter __w, Control parameterContainer)
{
__w.Write("\r\n\t\t\t");
}
Jinak bug je již reportován v Microsoft Connect (Feedback center), můžete se připojit k hlasování…