Динамическая загрузка 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-код или все, что вам нужно.
Да, это взлом, но он будет работать в крайнем случае.