views:

38

answers:

2

Ok, I am an experienced web developer but sometimes ASP.Net is tricking me. I have a master page in asp.net. Then I have a page based on that master page (home.aspx). Now in home.aspx.cs I want to access the asp:content controls to add controls programmatically.

Aspx looks like this:

<asp:Content ID="leftCol" ContentPlaceHolderID="cphLeftCol" Runat="Server">
  <asp:PlaceHolder ID="phLeftCol" runat="server">
  </asp:PlaceHolder>
</asp:Content>

I would expect that I can reference "leftCol" from my code behind. But it's unknown there. For testing I added my own placeholder "phLeftCol". I can reference that without issues.

Is there something I don't see?

A: 

You can't access the asp:Content control directly from your code behind. A content control is not added to the control heirarchy at runtime so it is not accessible from the code behind to add controls to at runtime. To add controls to it at runtime, you need to add another container control to the content control and add the controls to that (as you did with the placeholder control).

See this MSDN article for more information.

ben f.
So, my workaround is best practice. What a shame.
newtogit
There are other container controls maybe better suited to your situation than a placeholder control (would really have to know more about what your are doing), but the content control is not an option.
ben f.
A: 

You can't access "leftCol" control from home page code-behind because it is holder for content of that page, and code your home page is unaware of his content in the moment of injecting... you can only access controls in that content. Content injecting goes in asp.net from bottom up, so content of your home page, in this case everything between tags <asp:Content ID="leftCol" ...> and </asp:Content>, goes in placeHolder of a Master Page...

cheers

Marko