9

在我的 Web 项目的业务对象编辑器页面中,我在对象插入或更新后向管理员发送了一封通知电子邮件。但是,我不想发送纯文本邮件,而是想发送另一个我只是为此目的准备的 aspx 页面(Notification.aspx)的 html 输出。

首先我想,我可以创建一个 Notification.aspx 的实例,然后使用它的 RenderControl 方法来获取输出。

但是,在 Editor.aspx 页面的代码隐藏中,我什至无法访问通知的引用来创建新实例。

我想知道在另一个页面中加载和呈现页面的最佳做法是什么......

谢谢。

4

6 回答 6

25

您可以通过执行以下操作来呈现页面:

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

string html = _writer.ToString();
于 2009-03-15T14:12:45.383 回答
0

请参阅此问题/答案:我可以在 ASP.NET 上用 C# 设置 HTML/电子邮件模板吗?. Mark Brackett 有你正在寻找的东西,尽管那里也有很多其他有用的建议。

于 2009-03-15T14:07:54.893 回答
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();
}
于 2009-03-15T14:10:02.143 回答
0

听起来很棘手。请记住,页面也需要适当的 HttpContext 才能正确呈现。

我会考虑改用 UserControl。这些可以使用该Page.LoadControl()方法简单地加载和呈现。使用一些 jiggery-pokery,您可以在提取它的 HTML 时阻止它在页面中呈现。

于 2009-03-15T14:10:30.677 回答
0

RenderControl 不起作用,因为 Page 不会经历它的生命周期。过去,出于类似目的,我使用 HttpHandler 和 Response.Filter 来捕获流。我以前在ASP.NET 论坛上发布过代码。

编辑:如果您需要修改页面输出,您应该将它与MartinNH指出的Server.Execute重载结合起来。这将简化代码,删除 Response.Filter 等。如果只想直接输出页面,MartinNH的方法干净。

于 2009-03-15T14:13:19.920 回答
0

这就是你要找的:

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

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

于 2012-07-25T00:05:00.090 回答