如何从dll动态加载用户控件到asp:面板

时间:2011-10-26 10:15:22

标签: asp.net c#-3.0

我有超过3个网站。所以我想在这些应用程序中共享一些常见的用户控件。为此,我创建了一个新的Web应用程序,它具有通用的用户控件,即登录和其他一些控件。然后我使用下面的代码生成我加载到我的其他网站的ddl:

但我无法像使用using Control c = Page.LoadContnrol("contrlname.ascx")一样使用下面的代码将用户控件从dll加载到面板中。

Assembly assembly = Assembly.LoadFrom(pluginPath);
Type controlType = assembly.GetType("ABCCommon.controls.LoginPanel");
object controlss = Activator.CreateInstance(controlType);      

// this section doesn't load the user control from dll into panel

pnlLoginControl.Controls.Add((Control)c);

Assembly plugin = Assembly.LoadFrom(pluginPath);

    Type[] types = plugin.GetTypes();

    foreach (Type t in types)
    {
        if (typeof(UserControl).IsAssignableFrom(t))
        {
            UserControl control = (UserControl)Activator.CreateInstance(t);

            controls.Add(control);
        }
    }

    UserControl c = (UserControl)controls[0];

//此部分不会将用户控件从dll加载到面板

    this.pnlLoginControl.Controls.Add(c);   

请有人帮忙吗? 谢谢!

3 个答案:

答案 0 :(得分:1)

您必须使用VirtualPathProvider才能执行此操作。问题是Controls.Add(c)希望找到ascx文件但是在另一个项目中。

tutorial解释了要采取的步骤。

答案 1 :(得分:0)

未在装配中指定用户控件。用户控件由.ascx文件定义,并由asp.net在运行时在临时程序集中编译。

要实例化用户控件,您应该使用方法Page.LoadControl

答案 2 :(得分:0)

如果在项目中添加对DLL的引用,并使用接受类型的重载LoadControl方法(以及传递给构造函数的任何参数):

MyControl ctrl = LoadControl(typeof(MyControl), null); 

第二个参数用于将参数传递给参数化构造函数。

修改

如果这些是自定义服务器控件,只需在项目中添加对DLL的引用,并在使用该控件的任何页面上导入程序集:

using ABCCommon.Controls;

使用控件:

LoginPanel loginPanel = new LoginPanel();
loginPanel.ID = "loginPanel1";
pnlLoginControl.Controls.Add(loginPanel);