【问题标题】:When I instantiate an ASP.NET usercontrol at runtime, why does it ignore the ASCX file?当我在运行时实例化 ASP.NET 用户控件时,为什么它会忽略 ASCX 文件?
【发布时间】:2010-10-01 06:37:13
【问题描述】:

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

MyUserControl.ascx
MyUserControl.ascx.cs

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

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

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

但是,如果我在代码隐藏中重写 Render() 方法并手动输出内容,它会渲染。

我在这里错过了什么?

【问题讨论】:

    标签: asp.net user-controls render ascx


    【解决方案1】:

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

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

    您很可能希望将其放置在页面的某个部分,因此不要使用 Page.Controls,而是使用占位符:

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

    并使用如下代码:

    myPlaceholder.Controls.Add(myControl);
    

    这是动态添加控件的最佳方式,但如果您可以以声明方式进行,那会容易得多。

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

    记住:如果您要动态添加控件,请务必re-add the control every page load

    【讨论】:

    • 如果我在网站项目中执行此操作,您建议的方法可以正常工作,但我将如何在不扩展 Page 的普通类中执行,例如控制台应用程序?
    • 你不能。 LoadControl 方法需要来自 Web 服务器(Casini、IIS)的虚拟路径。这是使用 UserControl 的唯一方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    相关资源
    最近更新 更多