2009-01-25 9 views
6

Ich versuche, die ASP.NET (3.5) "Routing Modul" -Funktion zu verwenden, um benutzerdefinierte Seiten basierend auf den Inhalt der URL zu erstellen.Erstellen einer System.Web.UI.Page programmatisch in IHTTPHandler

Verschiedene Artikel wie dieser: http://blogs.msdn.com/mikeormond/archive/2008/05/14/using-asp-net-routing-independent-of-mvc.aspx erklären, wie ASP.NET Routing verwendet wird, um zu vorhandenen Seiten auf dem Webserver zu verzweigen.

Was ich tun möchte, ist die Seite mit Code on-the-fly erstellen.

Mein erster Versuch sieht wie folgt aus:

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; 

    } 

} 

Aber das wirft eine Httpexception sagen „Antwort in diesem Zusammenhang nicht zur Verfügung steht.“ in der Response.Write-Anweisung.

Irgendwelche Ideen, wie Sie vorgehen?

UPDATE: Am Ende ging ich mit einem Ansatz basierend auf IHttpModule, die sich als ziemlich einfach erwies.

Antwort

1

Anstatt zu versuchen, direkt in die Antwort zu schreiben, möchten Sie möglicherweise einfach die Steuerelemente zur Seite hinzufügen. Da die Seite brandneu ist und kein Markup enthält, müssen Sie möglicherweise alle HTML-Elemente hinzufügen, um legales HTML zu erstellen, damit es korrekt gerendert wird. Ich habe noch nie versucht, dass es funktioniert.

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

Es ist mir nicht klar, dass dies die erforderlichen HTML-, HEAD- und BODY-Tags haben wird. Es ist möglicherweise besser, eine Basisseite mit Skeleton-Markup zu erstellen, der Sie einfach hinzufügen können, und verwenden Sie den BuildManager wie im Beispiel zum Instanziieren dieser Seite, und fügen Sie dann Ihre Steuerelemente hinzu.

1

Put Request vor Response.Write, so requestContext.Response.Write

8

Sie können nicht auf die Antwort von einem IRouteHandler schreiben - es ist viel zu früh während des Anforderungslebenszyklus. Sie sollten nur auf die Antwort von innerhalb der IHttpHandler schreiben, die die Page ist.

Wie in anderen Beispielen gezeigt, müssen Sie eine Seiteninstanz von einem beliebigen Speicherort mit dem erforderlichen Inhalt abrufen.

Hier ist, wie Sie eine bestehende Seite laden:

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

Oder Sie können ein von Grund auf neu erstellen:

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

Ich wollte Ihnen nur danken, dass Sie 'BuildManager.CreateInstanceFromVirtualPath' hindeutet. Es half mir sehr bei etwas, an dem ich arbeitete. –

+0

Seite p = (Page) BuildManager.CreateInstanceFromVirtualPath ("~/MyPage.aspx", typeof (Page)); –

Verwandte Themen