参数注入动态创建的UserControls而无需专门化

时间:2009-06-10 18:24:50

标签: c# asp.net dependency-injection user-controls loadcontrol

我想知道的是,是否有一种方法可以将参数注入到渲染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中添加了一个Data成员,并在将控件呈现为HTML之前使用反射将数据源注入该成员。

我也看到Stefan Sedich's接受了@ScottGu示例,他在这个示例中派生了一个通用的ViewManager<Control>,它允许同样的事情,但避免了反射的需要。

例如,我希望能够在呈现Request之前将参数添加到QueryString对象或HttpContext中的UserControl

1 个答案:

答案 0 :(得分:0)

您是否考虑为继承自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

通常我不会为一个函数推荐更多的继承深度,但它可能在这里工作。