Динамическая загрузка UserControl с помощью метода LoadControl (Type, object[])

Я пытаюсь вернуть представление 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 ответа

На странице 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 в 18:31

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

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

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

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

Другие вопросы по тегам