внедрение параметров в динамически создаваемые пользовательские элементы управления без специализации - PullRequest
1 голос
/ 10 июня 2009

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

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

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

1 Ответ

0 голосов
/ 11 июня 2009

Рассматривали ли вы создание нового базового класса элемента управления для вашего приложения, который наследуется от объекта 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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...