Search code examples
asp.netuser-controlsrenderascx

When I instantiate an ASP.NET usercontrol at runtime, why does it ignore the ASCX file?


I've created a regular ASP.NET user control, including the ascx file. For example:

MyUserControl.ascx
MyUserControl.ascx.cs

Then I try to render the control manually, at runtime, using code similar to the following code:

var testMyUserControl = new MyUserControl();
var textWriter = 
    new HtmlTextWriter(
        new System.IO.StringWriter(new StringBuilder()));
testMyUserControl.RenderControl(textWriter);
Console.Write(textWriter.InnerWriter.ToString());

Nothing that I put in the ASCX file seems to render - either static HTML or any .NET controls.

However if I override the Render() method in the code-behind and manually output content, it does render.

What am I missing here?


Solution

  • You don't need to render your control yourself. If you need to add it to the page dynamically, you do it like:

    UserControl myControl = (UserControl) Page.LoadControl("~/Controls/MyControl.ascx");
    Page.Controls.Add(myControl);
    

    Most likely you'll want to place it in a certain part of the page, so instead of using Page.Controls, use a placeholder:

    <asp:Placeholder ID="myPlaceHolder" runat="server" />
    

    and use code like this:

    myPlaceholder.Controls.Add(myControl);
    

    This is the best way to add a control dynamically, but if you can do it declaratively instead that would be a lot easier.

    <%@ Register TagPrefix="my" TagName="Control" Src="~/Controls/MyControl.ascx" %>
    
    <my:Control ID="myControl" runat="server" />
    

    Remember: if you're adding the control dynamically, be sure to re-add the control every page load.