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

时间:2011-05-10 00:56:58

标签: c# asp.net

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

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

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),则永远不会评估列表视图。似乎只评估内联代码块。我怎么能绕过这个?

2 个答案:

答案 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。