我有超过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);
请有人帮忙吗? 谢谢!
答案 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);