在另一个aspx页面中呈现一个aspx页面

10
在我的Web项目的业务对象编辑页面中,在对象插入或更新后,我会向管理员发送通知电子邮件。但是,我想发送另一个为此目的准备的aspx页面(Notification.aspx)的HTML输出,而不是发送纯文本邮件。
起初,我以为可以创建Notification.aspx的实例,然后使用其RenderControl方法获取输出内容。但是,在Editor.aspx页面的代码后台中,我甚至无法访问Notification的引用以创建新实例。
我想知道在另一个页面中加载和呈现页面的最佳做法是什么...
谢谢。
6个回答

26

你可以通过以下方式渲染一个页面:

StringWriter _writer = new StringWriter();
HttpContext.Current.Server.Execute("MyPage.aspx", _writer);

string html = _writer.ToString();

1
我以前不知道还有这种重载方法。原来还有一个可以接收IHttpHandler参数的方法,这样就可以订阅页面事件并在呈现之前修改输出内容。非常好用,大大简化了下面我的EmailPageHandler代码。点个赞! - Mark Brackett
谢谢。这是最简单的方法 :)现在我也想知道是否可以异步地进行此过程?因为生成邮件正文的HTML需要一些时间。 - koraytaylan
我会通过创建一个新的线程,在一个方法中放置渲染代码,并在新的线程中执行该方法。 - MartinHN

0

当发出请求时,ASP.NET运行时会实例化页面类。因此,您可以发出请求并捕获响应:

using (WebClient client = new WebClient())
using (Stream stream = client.OpenRead("http://mysite.com/notification.aspx"))
using (StreamReader reader = new StreamReader(stream))
{
    var contents = reader.ReadToEnd();
}

0

这就是你要找的东西:

Type t = BuildManager.GetCompiledType("~/mypage.aspx");
Page p = (Page)Activator.CreateInstance(t);
p.ProcessRequest(HttpContext.Current);

从这里开始发挥你的想象力...


0

0

听起来有些棘手。请记得页面需要适当的HttpContext才能正确渲染。

我建议使用UserControl代替。这些可以使用Page.LoadControl()方法简单地加载和渲染。通过一些技巧,您可以在提取其HTML时阻止它在页面中呈现。


0

RenderControl不起作用,因为页面不会通过其生命周期。 我以前曾经使用HttpHandler和Response.Filter来捕获流以达到类似的目的。 我之前在 ASP.NET论坛上发布过代码

编辑:如果您需要修改页面输出,则应将其与MartinNH指出的Server.Execute重载相结合。 这将简化代码,删除Response.Filter等内容。 如果您只想直接获取页面输出,MartinNH的方法非常简洁。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接