Подтвердить что ты не робот

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

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

[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[]).: - (

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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