2009-07-07 11 views
0

Ich schreibe einen benutzerdefinierten HTTP-Handler, um ein Bearbeitungsformular für ein Raster mit vorhandenen Benutzersteuerelementen bereitzustellen. Grundsätzlich erstellt mein Handler die Seiten-, Formular-, Kopf- und andere Steuerelemente, die erforderlich sind, um die vorhandenen Benutzersteuerelemente ordnungsgemäß zu rendern. Am Ende von ProcessRequest verwende ich Server.Execute, um die Seite auszuführen, die dynamisch erstellt wurde. Ich mache das, weil die Lösung, in der sich diese befindet, ein Benutzersteuerelement-Projekt ist und es keine Seiten gibt, noch können wir irgendwelche hinzufügen. Dies muss für mehrere Projekte wiederverwendbar sein.Wie bekomme ich einen benutzerdefinierten IHttpHandler zur Postback-Behandlung?

Das funktioniert gut bis zu dem Punkt, wo die Benutzersteuerelemente, die zu dieser "Seite" hinzugefügt werden, die Verwendung des Postback-Mechanismus erfordern. In der Benutzersteuerung ist Page.IsPostBack immer falsch und Steuerungsereignisse (wie ein Button-Klick) werden nicht behandelt. Es ist offensichtlich, dass mir ein kritischer Teil davon fehlt, wie eine typische ASP.NET-Seite funktioniert. Die Page-Klasse ist nur eine Implementierung eines IHttpHandler, aber es gibt eine Menge Code, von dem ich denke, dass er nicht notwendig sein sollte, um die grundlegenden Funktionen zu erhalten.

Irgendwelche Ideen?

Hier ist der grundlegende Code von meinem Basis-HTTP-Handler. Ich habe andere Klassen, die von diesem Basishandler erben, um die tatsächlichen Benutzersteuerelemente dem Formular der Seite hinzuzufügen.

public void ProcessRequest(HttpContext context) { 
     context.Response.ContentType = "text/html"; 

     HtmlGenericControl htmlPage = GetHtml(); 
     AddTitle(); 
     htmlPage.Controls.Add(_head); 

     HtmlGenericControl htmlBody = GetBody(); 

     _form.Action = context.Request.Url.ToString(); 
     _form.Method = "POST"; 
     htmlBody.Controls.Add(_form); 

     htmlPage.Controls.Add(htmlBody); 

     AddAjaxManager(); 
     AddScriptManager(); 

     _page.Controls.Add(htmlPage); 
     //_page.ProcessRequest(context); 

     context.Response.CacheControl = "No-Cache"; 
     context.Server.Execute(_page, context.Response.Output, true); 
    } 

    public bool IsReusable { get { return false; } } 

Antwort

0

Um dies funktionieren zu lassen, habe ich von Seite geerbt, anstatt IHttpHandler zu implementieren. Sie müssen immer noch den gesamten HTML-Code der Seite erstellen, aber Sie erhalten alle Wunderbarkeit (oder nicht) des ASP.NET WebForms-Seitenlebenszyklus, wenn Sie dies tun.

Verwandte Themen