2009-01-25 5 views
6

Estoy intentando utilizar la funcionalidad de "Módulo de enrutamiento" de ASP.NET (3.5) para crear páginas personalizadas basadas en el contenido de la URL.Creación de System.Web.UI.Page programáticamente en IHTTPHandler

Varios artículos, como este: http://blogs.msdn.com/mikeormond/archive/2008/05/14/using-asp-net-routing-independent-of-mvc.aspx explican cómo usar el enrutamiento ASP.NET para bifurcar a las páginas existentes en el servidor web.

Lo que me gustaría hacer es crear la página sobre la marcha usando el código.

Mi primer intento se ve así:

public class SimpleRouteHandler : IRouteHandler 
{ 

    public IHttpHandler GetHttpHandler(RequestContext requestContext) 
    { 
     string pageName = requestContext.RouteData.GetRequiredString("PageName"); 

     Page myPage = new Page(); 
     myPage.Response.Write("hello " + pageName); 
     return myPage; 

    } 

} 

Pero esto arroja una HttpException diciendo "La respuesta no está disponible en este contexto". en la declaración Response.Write.

¿Alguna idea sobre cómo proceder?

ACTUALIZACIÓN: Al final, fui con un enfoque basado en IHttpModule, que resultó ser bastante fácil.

Respuesta

1

En lugar de intentar escribir directamente en la respuesta, es posible que desee simplemente agregar controles a la página. Dado que la página es nueva y no tiene marcas, es posible que deba agregar todos los elementos HTML para convertirla en HTML legal a fin de que se represente correctamente. Nunca habiendo probado esto, no tengo idea de si funcionará.

Page myPage = new Page(); 
page.Controls.Add(new LiteralControl("hello " + pageName)); 
return myPage; 

No tengo claro que esto tendrá las etiquetas HTML, HEAD y BODY requeridas. Podría ser mejor crear una página base que tenga un esqueleto marcado al que pueda agregarle controles y usar BuildManager como en el ejemplo para crear una instancia de esta página, luego agregue sus controles.

1

Put RequestContext antes Response.Write, por lo requestContext.Response.Write

8

No se puede escribir en la respuesta de un IRouteHandler - es demasiado pronto durante el ciclo de petición vida. Solo debe escribir en la respuesta desde IHttpHandler, que es lo que es Page.

Como se muestra en otros ejemplos, tendrá que obtener una instancia de página de algún lugar que tenga todo el contenido necesario.

Así es como se puede cargar una página existente:

Page p = (Page)BuildManager.CreateInstanceFromVirtualPath("~/MyPage.aspx"); 

O puede crear uno desde cero:

Page p = new Page(); 
p.Controls.Add(new LiteralControl(
    @"<html> 
     <body> 
      <div> 
       This is HTML! 
      </div> 
     </body> 
     </html>")); 
+0

Sólo quería darle las gracias por lo que sugiere que 'BuildManager.CreateInstanceFromVirtualPath'. Me ayudó mucho en algo en lo que estaba trabajando. –

+0

Página p = (Página) BuildManager.CreateInstanceFromVirtualPath ("~/MyPage.aspx", typeof (Página)); –

Cuestiones relacionadas