Как динамически загружать пользовательский элемент управления из библиотеки dll в asp: панель

#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); но возвращает нулевые кнопки и текстовые поля для пользовательского элемента управления login

4. Есть ли причина, по которой вы не регистрируете сборку в web.config и не объявляете элемент управления в разметке?

5. Я не понял вашу точку зрения, не могли бы вы уточнить это: «и объявление элемента управления в разметке»?