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