Peter Bucher - Mein Experiment, meine Spielereien, meine Welt...   ·   Stefan Falz   ·   Jürgen Gutsch   ·   Golo Roden   ·   ASP.NET Zone   ·   Microsoft ASP.NET
Willkommen bei ASP.NET Zone. Anmelden | Registrieren | Hilfe

Die alten Bekannten - Response.Write() und Request.Form[]

Im Bezug zu meinen Äusserungen bspw. in diesem Thread möchte ich hier meine Meinung zu den alten Bekannten kundgeben.

Viele - allen voran die Classic ASPler - werden Response.Write() und Request.Form[] gut kennen.
Schliesslich waren diese zwei Methoden täglich Brot und Wasser in der alltäglichen Entwicklung.

Ich habe mich schon ein paar Mal geäussert, das Response.Write() und Request.Form[] nicht mehr benutzt werden sollten.
Wieso?

In Classic ASP war - weitgehenst - strukturierte Programmierung angesagt.
Eine Seite bestand aus Html / etc... und Inline Code und sie wurde prozedural abgearbeitet.

Ein Befehl kommt nach dem anderen, ein Funktionsaufruf nach dem anderen.
Soweit alles ziemlich klar nachvollziehbar und alles unter Kontrolle.
Genau dort war Response.Write() _das_ Mittel zum Zweck.

In ASP.NET haben sich grundlegende Dinge geändert.
So stehen wir vor einer vollkommen objektorientierten Umgebung, die unter anderem auch Events und deren Behandlung offenlegt.
Von der Anforderung bis zum Sendes des Outputs an den Client vergeht eine gewisse Zeitspanne. In dieser Zeitspanne werden
Ereignisse in bestimmten Reihenfolgen gefeuert und abgearbeitet.

Eine ASP.NET Seite besteht aus einer Hierarchie von Controls (Beim beim kleinsten Nenner sind das LiteralControls),
die selber auch einen Lebenszyklus haben bzw. sich in den Lebenszyklus der übergeordneten Controls bis zur Page einfügen.

Im Optimalfall erfolgt die Programmierung unter ASP.NET nur noch über Controls und Seiten die diese Hosten.
ASP.NET erzeugt aus der Control Hierarchie jeweils automatisch den Output für die Seite (natürlich kann da auch eingegriffen werden.).
Wir sind also nicht mehr darauf angewiesen, unseren Output Zeile oder Buchstabe für Buchstabe in den Output Stream zu schreiben.
Es besteht die viel komfortablere Art der Programmierung und des Zugriffes mithilfe von Lebenszyklen, Events, Controls und bspw. dessen Eigenschaften.

Wenn jetzt, in irgend einem Ereignishandler (bspw. Button_Click) per Response.Write() eine Ausgabe getätigt wird, steht diese Zuoberst in der Ausgabe, noch vor dem eigentlichen Seitengrundgerüst.
Der Lebenszyklus einer Seite wird dadurch umgangen, meistens sogar unwissend.
Und genau das macht Response.Write() meiner Ansicht nach, für die meisten Fälle, "böse" bzw. gefährlich und unberechenbar.

(Ich möchte nicht bestreiten, das es natürlich immer Ausnahmen gibt, obwohl mir jetzt adhoc keine einfällt ;-)

Request.Form[] ist dagegen noch spezieller.
Diese Funktion wurde (oder eine ähnliche) in P*P, Classic ASP, etc... benutzt, um Werte von Formularen zu empfangen.
In ASP.NET braucht es diese Funktion in den meisten Fällen (Die berühmten Ausnahmen), nicht mehr.

Es ist viel komfortabler und ASP.NET like, wenn Eigenschaften bspw. einer TextBox -> <TextBox>.Text, benutzt werden um Werte abzufragen.
Die meisten Ausnahmen sind wohl in erweiterten Themen wie bspw. der Control Entwicklung oder sowas zu finden.
Wer Request.Form[] benutzt sollte wissen, damit den Lebeszyklus gewissermassen auszuhebeln, was auch probematisch sein könnte.

Veröffentlicht Montag, 4. Februar 2008 20:39 von Peter Bucher

Kommentare

# re: Die alten Bekannten - Response.Write() und Request.Form[]

Toller Artikel :-)

Eine Ausnahme zu Response.Write() fällt mir gerade noch ein. (Okay, nicht im "klassischen Gebrauch")

z. B: beim schreiben von Dynamischen JavaScripts oder Styles per HttpHandler. Innerhalb des Handlers würde ich die Daten mit context.Respone.Write() rausschreiben...

Dienstag, 5. Februar 2008 08:31 by Jürgen Gutsch

# re: Die alten Bekannten - Response.Write() und Request.Form[]

Hi Jürgen

Danke für deinen Kommentar.

Jup, wäre auch so ziemlich die einzige Ausnahme, die mir auch einfallen würde :-)

Dienstag, 5. Februar 2008 09:31 by Peter Bucher

# re: Die alten Bekannten - Response.Write() und Request.Form[]

<zitat>Wir sind also nicht mehr darauf angewiesen, unseren Output Zeile oder Buchstabe für Buchstabe in den Output Stream zu schreiben.

Es besteht die viel komfortablere Art der Programmierung und des Zugriffes mithilfe von Lebenszyklen, Events, Controls und bspw. dessen Eigenschaften.

Wenn jetzt, in irgend einem Ereignishandler (bspw. Button_Click) per Response.Write() eine Ausgabe getätigt wird, steht diese Zuoberst in der Ausgabe, noch vor dem eigentlichen Seitengrundgerüst.

</zitat>

das ist die eigentliche Kernaussage: es geht größtenteils einfacher, komfortabler und zum anderen ist es in bestimmten Konstellationen einfach nicht angebracht (zB im Eventhandler)

Javascriptcode würde ich allerdings auch nicht mit Response.Write zum Client schicken, sondern mit dem ClientScriptManager.

Gruß

Rene

Dienstag, 5. Februar 2008 20:49 by Rene Drescher-Hackel

# re: Die alten Bekannten - Response.Write() und Request.Form[]

Hallo Rene

Genau :-)

> Javascriptcode würde ich allerdings auch nicht mit Response.Write zum Client schicken, sondern mit dem ClientScriptManager

Also in einem HttpHandler nützt dir der ClientScriptManager nicht viel.

Kommt immer darauf an, was schlussendlich erreicht werden will.

Ich habe ein Satz Methoden, mit dem ich die meiste Arbeit erledigen kann (bspw. Includes direkt in den Header schreiben).

Aber ansonsten ist der ClientScript Manager die erste Wahl.

Ausser es geht um dynamischen Javascript Code.

Da brauchts ein Handler und entsprechend context.Response.Write() :-)

Dienstag, 5. Februar 2008 20:57 by Peter Bucher

# Artikel: Identifizierung von Controls: Control.ID / .ClientID / .UniqueID

ASP.NET Controls haben 3 verschiedene Eigenschaften, anhand dessen man sie identifizieren kann. Na gut,

Montag, 17. März 2008 23:30 by Peter Bucher

# re: Die alten Bekannten - Response.Write() und Request.Form[]

Hallo,

guter Artikel, sehe ich prinzipiell auch so.

Das Rausschreiben in eine Labelbox, etc. funktioniert aber nur bei kurz andauernden Prozessen.

Bei lang andauernden Prozessen (zB Datenbankzugriffe, Backuproutinen, etc) wird der Fortschritt (zB Statuswerte) erst nach Ende des Prozesses dem User in der LabelBox angezeigt.

Wie kann man das ASP.NET Like lösen?!

LG

Georg

Samstag, 12. Juli 2008 10:28 by sheridan

# re: Die alten Bekannten - Response.Write() und Request.Form[]

Hallo Georg

Es funktioniert schon genau gleich, jedoch zeitverzögert.

Die "alte" Möglichkeit - die auch schon in Classic ASP Verwendung hatte - ist die Benutzung von Response.Buffer / Response.Flush.

Oder aber der Prozess läuft weiter und der Status wird über Callbacks (AJAX) aktualisiert.

Meistens sind solche Aufgaben allerdings nicht für ASP.NET geeignet, das sieht man auch daran das keine andauernde Verbindung besteht und es keine _wirkliche_ saubere Lösung dafür gibt.

Gruss Peter

Samstag, 12. Juli 2008 15:20 by Peter Bucher

# ASP.NET Grundlagen Teil 1: Ein Blick hinter die Kulisse

Dies ist der Beginn der Artikelserie "ASP.NET Grundlagen" mit folgenden Teilen: Teil 1 (Dieser Artikel)

Sonntag, 14. September 2008 23:21 by Peter Bucher
Anonyme Kommentare sind nicht zugelassen