2009-06-10 45 views
1

我想知道的是,如果有一种技术注入参数到渲染HttpContext,这样它将可用于UserControl当其页面生命周期事件(Page_Init,Page_Load )在渲染过程中被调用(在HttpContext.Current.Server.Execute()期间)?参数注入动态创建UserControls没有专门化

这样的技术可以允许将数据注入到任何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。

我也看过Stefan Sedich's采取@ScottGu的例子,他从中衍生出一个通用的ViewManager<Control>,它允许同样的事情,但避免了反思的需要。

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

回答

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 

通常我woldn't推荐更多的传承深度为一个功能继承,但它可能会在这里工作。

+0

你的建议是一个可行的解决方案,但它对我来说似乎不雅。另外,它需要专门的UserControl,我试图避免。 – 2009-06-11 02:19:10