2009-03-15 19 views
9

En la página del editor de objetos de negocio de mi proyecto web, envío un correo electrónico de notificación al administrador después de insertar o actualizar un objeto. Pero en lugar de enviar un mensaje de texto sin formato, quiero enviar la salida html de otra página aspx (Notification.aspx) simplemente preparada para este propósito.representación de una página aspx en otra

Primero pensé, puedo crear una instancia de Notification.aspx y luego usar su método RenderControl para obtener el resultado.

Sin embargo, en el código detrás de la página Editor.aspx, ni siquiera puedo acceder a la referencia de la notificación para crear una nueva instancia.

Me pregunto cuál es la mejor práctica para la carga y la prestación de una página en otro ...

Gracias.

Respuesta

24

Puede representar una página al hacer esto:

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

string html = _writer.ToString(); 
+1

nunca supe de eso sobrecarga. Resulta que hay otro que toma un IHttpHandler, que le permite suscribirse a eventos de página y modificar el resultado antes de renderizar. Muy agradable, y simplifica significativamente mi código EmailPageHandler a continuación. +1 –

+0

gracias. que hizo el truco de la manera más simple :) ahora también me pregunto ¿puedo hacer este proceso de forma asíncrona? porque lleva algún tiempo generar el html del cuerpo del correo – koraytaylan

+0

Lo haría creando un nuevo hilo, coloque el código de procesamiento en un método. Y ejecuta el método en el nuevo subproceso. – MartinHN

0

La instancia de ASP.NET instancia la clase de página cuando se realiza una solicitud. Para que pueda hacer una solicitud y obtener la captura de la respuesta:

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

Suena complicado. Tenga en cuenta que la página también necesitará un HttpContext apropiado para poder representarse correctamente.

Consideraría usar un UserControl en su lugar. Estos pueden simplemente cargarse y procesarse con el método Page.LoadControl(). Con un poco de jiggery-pokery, puede evitar que aparezca en la página mientras extrae su HTML.

0

RenderControl no va a funcionar, porque la página no va a ir a través de su ciclo de vida. He usado un HttpHandler y un Response.Filter para capturar la transmisión en el pasado con un propósito similar. He publicado el código en el ASP.NET forums previously.

Editar: Si necesita modificar la salida de página, debe combinar esto con la sobrecarga Server.Executepointed out de MartinNH. Eso simplificaría el código, eliminando el Response.Filter y tal. Si solo desea la salida de la página directamente, el método de MartinNH es muy limpio.

0

esto es lo que busca:

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

de aquí utiliza su imaginación ....

Cuestiones relacionadas