我正在尝试创建一个可以作为电子邮件发送的用户控件模板。
在实用程序类中,我有一个包含此代码的方法:
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),则永远不会评估列表视图。似乎只评估内联代码块。我怎么能绕过这个?
答案 0 :(得分:5)
您实际上应该将控件添加到页面并执行页面:
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)
{
}
}
它允许您的控件具有没有<form>
包装器的输入元素。
此方法将调用页面生命周期方法并很好地绑定表单元素。
答案 1 :(得分:0)
你可以有一个Public函数(也就是ProcessLoad),而不是Page_Load函数,并在加载控件后立即调用它。这样您也可以将参数传递给UserControl。