HttpHandler der besonderen Art - Page Handler
HttpHandler wurden von mir hier im Blog schon einmal erläutert und ein zweites Mal aufgegriffen.
Es ist also möglich einen HttpHandler innerhalb eines Controls zu kapseln, das ist praktisch wenn
ein Control in sich geschlossen eine Möglichkeit hat, einen eigenen Handler aufzurufen.
Mit anderen Worten muss die Seite, die das Control konsumiert, keinen Handler in der Struktur haben,
sondern dieser ist im Control gekapselt.
Es gibt nicht extrem viele Situaionen wo dies erforderlich oder wünschenswert wäre, aber genau bei
diesen speziellen Anforderungen ist es doch toll, wenn es geht.
Wie schon zuvor angesprochen, implementiert die Klasse Page (System.Web.UI.Page) auch
die Schnittstelle IHttpHandler.
Da diese Klasse einen Handler darstellt, kann diese bzw. eine Ableitung davon ebenso Projektintern
als Code hinterlegt und in der web.config auf einen Alias, etc... registriert werden.
Das ergibt tolle Möglichkeiten.
So wäre es theoretisch denkbar, das eine ASP.NET Anwendung nur aus einer DLL besteht,
die alles enthält. (Ob das Sinn macht, ist wieder eine andere Frage :).
Ich habe ein kleines Beispielprojekt erstellt, das ihr hier herunterladen und euch ein Bild davon machen könnt.
Das Projekt enthält eine Web Application, ein Control Projekt mit einem Test Control und dem Page Handler.
Das Test Control zeigt mehrere TextBoxen an, die am Ende mit einem Link versehen sind, um ein Datum auszuwählen.
Dieser Link öffnet ein Popup und darin befindet sich der Ouput des Page Handlers, der einen Kalender ausgibt.
Folgend der Code des Page Handlers:
public class CalendarPageHandler : Page
{
private string _target;
protected override void OnInit(EventArgs e) {
base.OnInit(e);
this._target = Request.QueryString["target"].ToString() ?? String.Empty;
HtmlForm form = new HtmlForm();
form.ID = "myForm";
this.Controls.Add(form);
Calendar calendar = new Calendar();
calendar.ID = "myCalendar";
calendar.DayRender += new DayRenderEventHandler(calendar_DayRender);
form.Controls.Add(calendar);
}
void calendar_DayRender(object sender, DayRenderEventArgs e)
{
e.Cell.Controls.Clear();
HyperLink h = new HyperLink();
h.ID = "dayHyperlink";
h.Text = e.Day.DayNumberText;
h.NavigateUrl = String.Format("BLOCKED SCRIPT window.opener.document.getElementById('{0}').value = '{1}'; self.close();",
this._target, e.Day.Date.ToShortDateString());
e.Cell.Controls.Add(h);
}
protected override void OnLoad(EventArgs e) {
base.OnLoad(e);
}
}