Внедрение параметров в динамически создаваемые пользовательские элементы управления без специализации

То, что я хотел бы знать, есть ли метод для ввода параметров в рендеринг HttpContext так что это будет доступно для UserControl когда события жизненного цикла его страницы (Page_Init, Page_Load) вызываются во время рендеринга (во время HttpContext.Current.Server.Execute())?

Такой метод позволил бы вводить данные в любой UserControl (скажем, посредством вызова удаленного сервиса) без необходимости специализировать его для динамического рендеринга. Он будет загружаться так же, как если бы это был статический элемент управления на странице ASPX.

Начнем с этого фрагмента кода:

Page page = new Page();
UserControl ctl = (UserControl)page.LoadControl(controlSpec);
page.Controls.Add(ctl);

// want to inject data into the control at this point

StringWriter writer = new StringWriter();
HttpContext.Current.Server.Execute(page, writer, true);
String renderedContent = writer.ToString();
return renderedContent;

Я видел пример @ScottGu ViewManager, где он добавляет элемент данных в каждый из своих UserControls и использует отражение, чтобы вставить источник данных в этот элемент, прежде чем элемент управления будет отображен в HTML.

Я также видел, как Стефан Седич взял пример @ScottGu, где он получил общий ViewManager<Control> что позволяет то же самое, но избегает необходимости размышлений.

Например, я хотел бы иметь возможность добавить параметр в Request объект или QueryString в HttpContext до рендеринга UserControl,

1 ответ

Рассматривали ли вы создание нового базового класса элемента управления для вашего приложения, который наследуется от объекта UserControl, тогда ваши пользовательские элементы управления будут основываться на этом классе, а не на пользовательском элементе управления. Затем вы можете создать методы для вставки данных в элементы управления в базовом классе, которые будут доступны из ваших элементов управления.

public class DataDrivenUserControl : UserControl
{
// implement stuff here
}

Ваши элементы управления могут наследовать от этого класса

DataDrivenUserControl ctl = (UDataDrivenUserControl)page.LoadControl(controlSpec);
page.Controls.Add(ctl);
ctl.InjectData(data);// or however you want to implement data injection methods

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

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