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

时间:2009-03-15 13:48:47

标签: c# asp.net rendering

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

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

然而,在Editor.aspx页面的代码隐藏中,我甚至无法达到Notification的创建新实例的参考。

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

感谢。

6 个答案:

答案 0 :(得分:25)

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

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

string html = _writer.ToString();

答案 1 :(得分:0)

看到这个问题/答案:Can I set up HTML/Email Templates in C# on ASP.NET?。马克·布拉克特(Mark Brackett)有你想要的东西,尽管那里还有很多其他有用的建议。

答案 2 :(得分: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();
}

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

RenderControl不起作用,因为Page不会经历它的生命周期。为了类似的目的,我使用了一个HttpHandler和一个Response.Filter来捕获过去的流。我已在ASP.NET forums previously发布了代码。

编辑:如果您需要修改页面输出,则应将其与MartinNH的Server.Execute重载pointed out结合使用。这将简化代码,删除Response.Filter等。如果您只想直接输出页面,MartinNH的方法非常干净。

答案 5 :(得分:0)

这就是你要找的东西:

Type t = BuildManager.GetCompiledType("~/mypage.aspx");
Page p = (Page)Activator.CreateInstance(t);
p.ProcessRequest(HttpContext.Current);
从这里开始使用你的想象力......