在具有服务器控件的页面上使用LoadControl

我正在尝试创建一个可以作为电子邮件发送的用户控件模板。

在实用程序类中,我有一个包含此代码的方法:

StringBuilder sb = new StringBuilder(); Page p = new Page(); UserControl ctrl = (UserControl)p.LoadControl("~/EmailTemplates/OrderConfirmation.ascx"); StringWriter sw = new StringWriter(sb); Html32TextWriter htw = new Html32TextWriter(sw); ctrl.RenderControl(htw); 

这正确地写入了用户控件文本,但是如果我想在控件页面内使用服务器控件(例如listview),则永远不会评估列表视图。 似乎只评估内联代码块。 我怎么能绕过这个?

您应该实际将控件添加到页面并执行页面:

  var page = new FormlessPage(); var ctrl = (UserControl)page.LoadControl("~/EmailTemplates/OrderConfirmation.ascx"); page.Controls.Add(ctl); StringWriter writer = new StringWriter(); HttpContext.Current.Server.Execute(page, writer, false); return writer.ToString(); 

无形页面看起来像:

 public class FormlessPage : Page { public override void VerifyRenderingInServerForm(Control control) { } } 

它允许您的控件具有没有

包装器的输入元素。

此方法将调用页面生命周期方法并很好地绑定表单元素。

您可以使用Public函数(也称为ProcessLoad),而不是Page_Load函数,并在加载控件后立即调用它。 这样您也可以将参数传递给UserControl。