Динамическая загрузка UserControl с помощью метода LoadControl (Type, object []) - PullRequest
20 голосов
/ 16 января 2009

Я пытаюсь вернуть html-представление пользовательского / серверного элемента управления через метод страницы. Это работает, когда я вызываю перегрузку, которая ведет виртуальный путь к пользовательскому элементу управления, но не когда я пытаюсь вызвать перегрузку, которая принимает тип. Пример кода приведен ниже. Есть предложения?

[WebMethod]
public static string LoadAlternates(string productId, string pnlId)
{
    object[] parameters = new object[] { pnlId, productId };
    return ControlAsString(typeof(PopupControl), parameters);
}

private static string ControlAsString(Type controlType, object[] parameters)
{
    Page page = new Page();
    UserControl controlToLoad;
    /*
     *calling load control with the type results in the 
     *stringwriter returning an empty string
    */

    controlToLoad = page.LoadControl(controlType, parameters) as UserControl;
    /*
     *However, calling LoadControl with the following overload
     *gives the correct result, ie the string rep. of the control.
    */
     controlToLoad = page.LoadControl(@"~/RepeaterSamples/PopupControl.ascx") as UserControl;

    //some more code, then this... 
    page.Controls.Add(controlToLoad);

    StringWriter sw = new StringWriter();
    HttpContext.Current.Server.Execute(page, sw, false);
    return sw.ToString();
}

Есть идеи, почему этот StringWriter будет возвращать пустую строку? Следует отметить, что весь жизненный цикл «страницы» выполняется правильно, независимо от метода, выбранного для вызова LoadControl.

Хотел добавить - У меня есть для использования перегрузки LoadControl(Type, object[]). : - (

Ответы [ 3 ]

25 голосов
/ 16 января 2009

На странице MSDN для LoadControl этот комментарий внизу:

Описание
Страница, которая загружает пользовательский элемент управления, используя Page.LoadControl (Type, Object []), похоже, не создает своих потомков добавлено в файл ascx. Использование Page.LoadControl (String) работает как ожидается.

Комментарии
Благодарим Вас за предоставление этой проблемы. Мы расследуем и предоставит обновленную информацию о состоянии, когда у нас будет больше информации.

- Группа разработчиков веб-платформ и инструментов
Опубликовано Microsoft 8/06/2005 в 11:08
Это не совсем понятно, поскольку тип "TestUC" на самом деле базовый тип, используемый частичным классом, он не содержит надлежащего код для создания экземпляра ссылки TextBox1, который фактически определен в производный тип. Есть два обходных пути: 1. Использование LoadControl ("TestControl.ascx"), для всех практических, это ведет себя идентично LoadControl (тип), но он создает производный тип, который знает, как создать экземпляр TextBox1. 2. Используйте одну страницу файла и добавляет директиву <% @ Reference%> на страницу для ссылки на пользователя контролировать и назначить имя класса на странице ascx. Тогда это безопасно использовать LoadControl (тип)

Спасибо за сообщение о проблеме.
Команда веб-платформ и инструментов. Сообщение от Microsoft 14/06/2005 в 6:31 вечера

6 голосов
/ 16 января 2009

Эта перегрузка создает экземпляр базового класса, но не создает никаких элементов управления на нем, поэтому он не работает.

Я сделал быстрое сообщение в блоге об обходном пути для передачи параметров, если вам интересно.

0 голосов
/ 16 января 2009

Если вы хотите, чтобы элемент управления полностью отображался, один из способов сделать это - создать экземпляр элемента управления, которым вы сейчас пользуетесь LoadControl, а затем временно добавить его в коллекцию элементов управления другого элемента управления или самой страницы. Это инициализирует жизненный цикл для этого элемента управления и вызовет все соответствующие события. Сделав это, вы можете получить отрендеренный HTML-код или все, что вам нужно.

Да, это взлом, но он будет работать в крайнем случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...