以编程方式加载在 web.config 中注册的代码隐藏中的用户控件

本文关键字:注册 代码 隐藏 控件 用户 config 方式 编程 加载 web | 更新日期: 2023-09-27 18:30:16

是否可以

加载在 web.config 文件中注册的用户控件,而不是在 aspx 文件中注册的用户控件?

这是我会做什么的一个例子。在我的aspx中:

索引.aspx

<%@ Register TagPrefix="module" TagName="ModExample" Src="~/controls/example.ascx" %>

索引.cs

protected void Page_Load(object sender, EventArgs e)
{
    controls_example exmp = LoadContent("controls/example.ascx") as controls_example;
    myContentPanel.Controls.Add(exmp);
}

我必须在页面中注册我的用户控件,否则 ASP 将不知道"controls_example"是什么。但是,我知道您可以将 web.config 更改为如下所示:

<configuration>
    <system.web>
        <pages>
            <controls>
                <add tagPrefix="module" tagName="ModExample" src="~/controls/contentModule.ascx"/>
                <add assembly="Subtext.Web.Controls" namespace="Subtext.Web.Controls" tagPrefix="module"/>
            </controls>
        </pages>
    </system.web>
</configuration>

所以,这就是问题所在。如何在 web.config 文件中注册类型为"controls_example"的变量?

我是否需要:

  • 添加"使用命名空间"?
  • 在我的 web.config 中更改/添加某些内容?
  • 没有定义变量的数据类型是什么?(我很想避免这种情况)
  • 别的?

以编程方式加载在 web.config 中注册的代码隐藏中的用户控件

你的web.config看起来不错。在页面中,需要添加包含控件命名空间的using。然后,您可以使用页面的 LoadControl 方法来获取控件的实例,然后可以将其作为子控件添加到某个容器中(我通常选择一个asp:Placeholder以确保它的位置是我想要的位置)

@Adrian,这是我对你问题的回答。我必须在这里说,因为我会远远超过我的字符限制。

好的,我遇到的第一个问题是我使用的是 ASP.NET 网站,而不是 ASP.NET 应用程序。我选择这个,所以我使用后者。这使得从那时起创建的所有页面默认情况下都有一个命名空间(即它们所在的文件夹的名称)。我不知道您是否可以使用网站中的命名空间注册控件,可能是因为网站默认情况下没有命名空间。

假设我制作了一个名为 myControl.ascx 的 Web 用户控件,并将其保存为 ~/controls/myControl.ascx 。查看 ascx 文件,顶行应为: <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="myControl.ascx.cs" Inherits="myApplication.controls.myControl" %> . myApplication是网站的名称,您可以将其种子添加到命名空间controls,因为这是它所在的文件夹。此外,如果您查看背后的代码,命名空间将匹配。

现在,从这里开始,您有 2 个有关如何注册和使用控件的选项。缓慢的方法是在拥有的每个页面上注册要使用的每个控件,如果每个控件只有几个,那就太好了。为此,请在要从中调用控件的页(例如索引页)中编写以下行:

<%@ Register TagPrefix="myC" TagName="myCoolControl" Src="~/control/myControl.ascx" %>

这是缓慢的方法,但它有效(除非我输入错误的内容)。

这就是我试图做的:这样我就不必键入一千次,并且只在web.config文件中键入一次。

web.config文件配置为如下所示:

<configuration>
    <system.web>
        <pages>
            <controls>
                <add tagPrefix="myCont" namespace="myApplication.controls" assembly="myApplication" />
            </controls>
        </pages>
    </system.web>
</configuration>

这将自动注册在"myApplication.controls"命名空间中创建的任何控件,如果设置正确,则它是在"控件"文件夹中创建的任何控件。请记住,您不必将文件夹称为"控件"即可正常工作,您可能在此处列出了任何命名空间,它应该可以正常工作。

现在打开一个要从编程(如索引)加载控件的页面。您不会在 aspx 文件中写入任何内容,包括有关注册页面的任何内容。该控件已经注册,所以我们所要做的就是将其加载到代码隐藏中:

myControl myCont = LoadControl("~/controls/myControl.ascx") as myControl;
//feel free to use the variable, or add it to the page with a panel or something

我真的希望这回答了你的问题。我确实需要一些挖掘才能让它工作,所以我很高兴帮助其他人解决这个问题。再次感谢CyberDude,是他让我朝着正确的方向前进。