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í…