рендеринг страницы aspx в другой

На странице редактора бизнес-объектов моего веб-проекта я отправляю администратору уведомление по электронной почте после вставки или обновления объекта. Но вместо отправки обычного текстового сообщения я хочу отправить html-вывод другой aspx-страницы (Notification.aspx), которую я просто подготовил для этой цели.

Сначала я подумал, что могу создать экземпляр Notification.aspx, а затем использовать его метод RenderControl для получения вывода.

Однако в коде страницы Editor.aspx я даже не могу получить доступ к ссылке на уведомление, чтобы создать новый экземпляр.

Интересно, как лучше всего загружать и отображать страницу на другой ...

Спасибо.


person koraytaylan    schedule 15.03.2009    source источник


Ответы (6)


Вы можете визуализировать страницу следующим образом:

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

string html = _writer.ToString();
person MartinHN    schedule 15.03.2009
comment
Я никогда не знал об этой перегрузке. Оказывается, есть еще один, который принимает IHttpHandler, который позволяет вам подписываться на события страницы и изменять вывод перед рендерингом. Очень красиво и значительно упрощает мой приведенный ниже код EmailPageHandler. +1 - person Mark Brackett; 15.03.2009
comment
благодаря. это сделало трюк самым простым способом :) теперь я также задаюсь вопросом, могу ли я сделать этот процесс асинхронным? потому что создание html тела письма занимает некоторое время - person koraytaylan; 15.03.2009
comment
Я бы сделал это, создав новый поток, поместив код рендеринга в метод. И выполните метод в новом потоке. - person MartinHN; 15.03.2009

См. Этот вопрос / ответ: Могу ли я настроить шаблоны HTML / электронной почты на C # в ASP.NET?. У Марка Брэкетта есть то, что вы ищете, хотя есть и много других полезных советов.

person John Rudy    schedule 15.03.2009

Класс страницы создается средой выполнения 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();
}
person Darin Dimitrov    schedule 15.03.2009

Звучит сложно. Имейте в виду, что для правильной визуализации странице также потребуется соответствующий HttpContext.

Вместо этого я бы подумал об использовании UserControl. Их можно просто загрузить и отобразить с помощью метода Page.LoadControl(). Приложив немного хитрости, вы можете уберечь его от рендеринга на странице при извлечении HTML.

person Tor Haugen    schedule 15.03.2009

RenderControl не будет работать, потому что страница не пройдет через свой жизненный цикл. Я использовал HttpHandler и Response.Filter для захвата потока в прошлом с той же целью. Я разместил код на форумах ASP.NET ранее.

Изменить: если вам нужно изменить вывод страницы, вы должны объединить это с сервером. Выполнить перегрузку, указанную MartinNH . Это упростило бы код, удалив Response.Filter и тому подобное. Если вы просто хотите, чтобы страница выводилась напрямую, метод MartinNH очень чист.

person Mark Brackett    schedule 15.03.2009

это то, что вы ищете:

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

отсюда используйте свое воображение ....

person ygaradon    schedule 25.07.2012