在具有服务器控件的页面上使用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。
- 如何使用Owin中间件拦截404
- 为什么我的XML阅读器会读取所有其他元素?
- 你能用JavaScript调用C#函数吗?
- 是否有任何简单的方法可以按月/年/每日单位增加DateTime,而不必像疯了一样解析它?
- 无法使用html5“date”类型写入asp.net文本框控件
- 如何设置ASP.NET API / AngularJS项目
- 未调用AssemblyResolve,并且在序列化期间抛出FileNotFoundException
- 在MVC3中使用ADO.NET MySQL提供程序(无法找到请求的.Net Framework数据提供程序。可能未安装。)
- Web.Config 中的defaultRedirect问题