#asp.net #c#-3.0
#asp.net #c #-3.0
Вопрос:
У меня есть более 3 веб-сайтов. Поэтому я хочу поделиться некоторыми распространенными пользовательскими элементами управления среди этих приложений. Для этой цели я создал новое веб-приложение, имеющее общие пользовательские элементы управления, то есть логин, и некоторые другие элементы управления. Затем я создаю ddl, который загружаю на другие свои веб-сайты, используя приведенный ниже код:
Но я не смог загрузить пользовательский элемент управления из библиотеки dll в панель, используя приведенный ниже код, как мы делаем с помощью using Control c = Page.LoadContnrol("contrlname.ascx")
.
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);
Пожалуйста, кто-нибудь может помочь?
Спасибо!
Ответ №1:
Для этого вы должны использовать VirtualPathProvider. Проблема в том, что Контролирует.Add (c) ожидает найти файл ascx, но это в другом проекте.
В этом руководстве объясняется, какой шаг необходимо предпринять.
Комментарии:
1. Спасибо, Ваутер де Корт, да, это полезная статья.
Ответ №2:
Пользовательский элемент управления не указан в сборке. Пользовательский элемент управления определяется файлом .ascx и компилируется asp.net во время выполнения во временной сборке.
Чтобы создать экземпляр пользовательских элементов управления , вы должны использовать этот метод Page.LoadControl
.
Комментарии:
1. Спасибо, ты имеешь в виду Пейдж. LoadContnrol(«contrlname.ascx»), но я хочу загрузить из dll?
Ответ №3:
Если вы добавляете ссылку на библиотеку DLL в свой проект и используете перегруженный LoadControl
метод, который принимает тип (и любые параметры, переданные конструктору):
MyControl ctrl = LoadControl(typeof(MyControl), null);
Второй аргумент предназначен для передачи аргументов в параметризованный конструктор.
Редактировать
Если это пользовательские серверные элементы управления, просто добавьте ссылку на DLL в свой проект и импортируйте сборку на любые страницы, использующие этот элемент управления:
using ABCCommon.Controls;
Используйте элемент управления:
LoginPanel loginPanel = new LoginPanel();
loginPanel.ID = "loginPanel1";
pnlLoginControl.Controls.Add(loginPanel);
Комментарии:
1. спасибо, Джеймс, я тоже использовал этот метод, но у меня он не сработал!
2. Как это не сработало? Что произошло? Он не отображался или не компилировался?
3. Это не пользовательский элемент управления, и я также включил ссылку и возвращает элемент управления объекту здесь:
ChilliCommon.controls.LoginPanel abc = (ChilliCommon.controls.LoginPanel)LoadControl(typeof(ChilliCommon.controls.LoginPanel), null);
но возвращает нулевые кнопки и текстовые поля для пользовательского элемента управления login4. Есть ли причина, по которой вы не регистрируете сборку в web.config и не объявляете элемент управления в разметке?
5. Я не понял вашу точку зрения, не могли бы вы уточнить это: «и объявление элемента управления в разметке»?