【问题标题】:Using LoadControl on pages with server controls在带有服务器控件的页面上使用 LoadControl
【发布时间】:2011-08-22 02:13:15
【问题描述】:

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

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

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);

这会正确写入用户控件文本,但如果我想在控件页面内使用服务器控件(例如列表视图),则永远不会评估列表视图。似乎只评估内联代码块。我该如何解决这个问题?

【问题讨论】:

  • 您能粘贴一些代码,向我们展示控件的外观吗?因为它应该可以正常工作...

标签: c# asp.net


【解决方案1】:

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

    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> 包装器的情况下拥有输入元素。

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

【讨论】:

  • 谢谢...非常感谢。这是令人沮丧的一天。可以这样执行页面非常有趣。
  • @Nick:不客气。我正在做类似的事情,我通过将用户控件切换到“只读”模式来重新使用用户控件来构建 HTML 报告。我记得我花了几个小时试图构建或追踪解决方案。很高兴我能帮上忙!
【解决方案2】:

您可以有一个公共函数(又名 ProcessLoad),而不是 Page_Load 函数,并在加载控件后立即调用它。这样您也可以将参数传递给您的 UserControl。

【讨论】:

    猜你喜欢
    • 2010-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    相关资源
    最近更新 更多