当我在运行时实例化ASP.NET用户控件时,为什么忽略ASCX文件?

Jon*_*han 3 asp.net user-controls ascx render

我已经创建了一个常规的ASP.NET用户控件,包括ascx文件.例如:

MyUserControl.ascx
MyUserControl.ascx.cs
Run Code Online (Sandbox Code Playgroud)

然后我尝试在运行时使用类似于以下代码的代码手动渲染控件:

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

我放在ASCX文件中的任何内容似乎都没有呈现 - 静态HTML或任何.NET控件.

但是,如果我在代码隐藏中覆盖Render()方法并手动输出内容,则会进行渲染.

我在这里错过了什么?

Ada*_*sek 8

您不需要自己渲染控件.如果您需要动态地将其添加到页面,您可以这样做:

UserControl myControl = (UserControl) Page.LoadControl("~/Controls/MyControl.ascx");
Page.Controls.Add(myControl);
Run Code Online (Sandbox Code Playgroud)

很可能你会想把它放在页面的某个部分,所以不要使用Page.Controls,而是使用占位符:

<asp:Placeholder ID="myPlaceHolder" runat="server" />
Run Code Online (Sandbox Code Playgroud)

并使用这样的代码:

myPlaceholder.Controls.Add(myControl);
Run Code Online (Sandbox Code Playgroud)

这是动态添加控件的最佳方法,但是如果你可以以声明方式执行它,那将会更容易.

<%@ Register TagPrefix="my" TagName="Control" Src="~/Controls/MyControl.ascx" %>

<my:Control ID="myControl" runat="server" />
Run Code Online (Sandbox Code Playgroud)

请记住:如果您要动态添加控件,请务必在每次加载页面时重新添加控件.