it-swarm.com.de

Warum benötigen ASP.NET-Webformulare das Attribut Runat = "Server"?

Warum muss ich runat="server" für alle meine ASP.NET-Steuerelemente angeben, wenn es sich um ein obligatorisches Attribut handelt und server die einzige Option ist, die in meinem begrenzten Wissen über ASP.NET verfügbar ist. Wenn ich es nicht verwende, erhalte ich eine Fehlermeldung?

Ich verstehe zwar, dass ich es optional für meine HTML-Tags verwenden kann, und ich verstehe das Client/Server-Paradigma und was es eigentlich spezifiziert.

Handelt es sich um ein redundantes Tag, das einfach darauf zurückzuführen ist, dass das Steuerelement ein ASP.NET-Steuerelement ist, oder liegt ein Grund zugrunde?

200
johnc

Ich habe immer daran geglaubt, dass es mehr für das Verständnis war, dass Sie ASP.NET-Tags und HTML-Tags mischen können, und HTML-Tags haben die Option, entweder runat="server" zu sein oder nicht. Es schadet nichts, das Tag zu belassen, und es verursacht einen Compiler-Fehler, um es zu entfernen. Je mehr Dinge Sie über Web-Sprache implizieren, desto weniger einfach ist es für einen aufstrebenden Programmierer, diese Sprache zu erlernen. Das ist ein guter Grund, um über Tag-Attribute wortreich zu sein.

Dieses Gespräch wurde auf Mike Schinkels Blog zwischen ihm und Talbot Crowell von Microsoft National Services geführt. Die relevanten Informationen sind unten aufgeführt (erster Absatz aufgrund grammatikalischer Fehler in der Quelle umschrieben):

[...], aber die Bedeutung von <runat="server"> ist mehr für Konsistenz und Erweiterbarkeit. 

Wenn der Entwickler einige Tags (d. H. <asp: />) markieren muss, damit die ASP.NET-Engine ignoriert werden kann, gibt es möglicherweise auch das Problem der Namensraumkollisionen zwischen Tags und zukünftigen Verbesserungen. Durch die Anforderung des <runat="server">-Attributs wird dies negiert.

Es geht weiter:

Wenn <runat=client> für alle clientseitigen Tags erforderlich war, müsste der Parser alle Tags analysieren und den <runat=client>-Teil entfernen.

Er fährt fort: 

Zur Zeit, Wenn meine Vermutung richtig ist, wird der Parser ignoriert einfach den gesamten Text (Tags oder keine Tags), es sei denn, es handelt sich um ein Tag mit der runat=server-Attribut oder ein „<%“ Präfix oder ssi “<!– #include(...) Da ASP.NET für .__ konzipiert ist. Trennung der Webdesigner zulassen (foo.aspx) von den Webentwicklern (foo.aspx.vb) können die Webdesigner Verwenden Sie ihre eigenen Web-Designer-Tools, um Platzieren Sie HTML und clientseitiges JavaScript ohne über ASP.NET wissen zu müssen bestimmte Tags oder Attribute.

108
George Stocker

Ich mag es normalerweise nicht, zu raten, aber ich gehe zu diesem Thema ...

Wenn Sie sich an den .NET-Marketing-Hype von Microsoft damals (2001?) Erinnern, war es schwer zu sagen, was .NET überhaupt war. War es ein Server? eine Programmierplattform? eine Sprache? etwas ganz Neues? Angesichts der Anzeigen war es mehrdeutig, was Sie wollten - es löste einfach jedes Problem, das Sie haben könnten.

Meine Vermutung ist also, dass es eine versteckte große Vision gab, dass ASP.NET-Code überall ausgeführt werden kann - serverseitig OR - Clientseite, in einer mit der .NET-Laufzeitumgebung verbundenen Kopie von Internet Explorer. runat = "server" ist nur ein Überbleibsel, der zurückgelassen wird, weil es auf Client-Seite nicht in die Produktion geht.

Erinnern Sie sich an diese komischen Anzeigen? 

Verwandte: Artikel aus dem Register mit etwas .NET-Verlauf.

33
Corbin March

Auf dem Server können nicht alle Steuerelemente ausgeführt werden, die auf einer Seite must enthalten sein können. Zum Beispiel:

<INPUT type="submit" runat=server />

Dies ist im Wesentlichen das Gleiche wie:

<asp:Button runat=server />

Entfernen Sie den Runat = Server-Tag aus dem ersten und Sie haben eine Standard-HTML-Schaltfläche, die im Browser ausgeführt wird. Es gibt Gründe für und dagegen, ein bestimmtes Steuerelement auf dem Server auszuführen, und ASP.NET kann nicht "annehmen", was auf der Grundlage des HTML-Markups von Ihnen gewünscht wird. Es kann möglich sein, den runat = -Server für die <asp:XXX />-Familie von Steuerelementen zu "erraten", aber ich schätze, dass Microsoft dies für einen Hack an die Markup-Syntax und die ASP.NET-Engine halten würde.

13
Dave Swersky

Microsoft-Msdn-Artikel Die vergessenen Steuerelemente: HTML-Serversteuerelemente erläutert die Verwendung von runat = "server" mit einem Beispiel für das Textfeld <input type="text"> durch Konvertieren in <input type="text" id="Textbox1" runat="server">

Dadurch erhalten Sie programmgesteuerten Zugriff auf das HTML-Element in Der Server wird erstellt, bevor die Webseite erstellt und an den Client gesendet wird. Das HTML-Element muss ein ID-Attribut enthalten. Dieses Attribut dient als Identität für das Element und ermöglicht das Programmieren der Elemente anhand ihrer spezifischen IDs. Zusätzlich zu diesem Attribut wird das HTML-Element muss runat = "server" enthalten. Dies teilt dem Verarbeitungsserver mit, dass die Das Tag wird auf dem Server verarbeitet und ist nicht als .__ zu betrachten. traditionelles HTML-Element.

Kurz gesagt, um den programmgesteuerten Zugriff auf das HTML-Element zu ermöglichen, fügen Sie runat="server" hinzu.

8
display_name

Mein Verdacht ist, dass es darum geht, wie serverseitige Steuerelemente während der Verarbeitung identifiziert werden. Anstatt jedes Steuerelement zur Laufzeit anhand des Namens prüfen zu müssen, ob eine serverseitige Verarbeitung erforderlich ist, wird eine Auswahl der internen Knotendarstellung nach Tag vorgenommen. Der Compiler überprüft, ob alle Steuerelemente, für die Servertags erforderlich sind, während des Überprüfungsschritts über diese verfügen.

3
tvanfosson

HTML-Elemente in ASP.NET-Dateien werden standardmäßig als Text behandelt. Um diese Elemente programmierbar zu machen, fügen Sie dem HTML-Element ein runat="server"-Attribut hinzu. Dieses Attribut gibt an, dass das Element als Serversteuerelement behandelt werden soll.

2
ShaileshDev

Es ist da, weil alle Steuerelemente in ASP .NET von System.Web.UI.Control erben, das das Attribut "runat" hat.

in der Klasse System.Web.UI.HTMLControl ist das Attribut nicht erforderlich. In der Klasse System.Web.UI.WebControl ist das Attribut jedoch erforderlich.

edit: lass mich genauer sein. Da asp.net praktisch eine Zusammenfassung von HTML ist, benötigt der Compiler eine Anweisung, damit er weiß, dass ein bestimmtes Tag serverseitig ausgeführt werden muss. Wenn dieses Attribut nicht vorhanden wäre, kann ich es nicht zuerst auf dem Server verarbeiten. Wenn dies nicht der Fall ist, wird davon ausgegangen, dass es sich um ein reguläres Markup handelt, das an den Client weitergegeben wird.

1
Russ Bradberry

Ich denke, dass Microsoft diese Mehrdeutigkeit beheben kann, indem der Compiler das Attribut runat vor dem Kompilieren der Seite hinzufügt. Dies ähnelt der Art, die Java mit den Generics löscht. Statt zu löschen, könnte es stattdessen runat = server schreiben asp: Präfix für Tags, sodass der Entwickler sich nicht darum kümmern muss.

1
Stefan

Wenn Sie es für normale HTML-Tags verwenden, bedeutet dies, dass Sie diese programmgesteuert in Ereignisprozeduren usw. bearbeiten können, z. B. die Href oder Klasse eines Ankertags beim Laden der Seite ändern können geh schneller. 

Was die Benutzersteuerelemente und Serversteuerelemente angeht, nein, sie funktionieren einfach nicht ohne sie, ohne in das Innere des aspx-Präprozessors eingedrungen zu sein. Ich kann nicht genau sagen, warum, aber sie würden vermuten, dass sie aus guten Gründen schrieben Der Parser sucht auf diese Weise nach Dingen, die ausdrücklich als "etwas tun" gekennzeichnet sind. 

Wenn @JonSkeet irgendwo in der Nähe ist, wird er wahrscheinlich eine viel bessere Antwort geben können.

1
seanb

Das Attribut "asp" ist ein ziemlich redundantes Attribut und ist offensichtlich ein ASP - Element. Es sollte ausreichen, um es als serverseitig zugängliches Element zu identifizieren.

An anderer Stelle wurden jedoch normale Tags angehoben, die im Code-Behind verwendet werden sollen.

0
captainobvious

Zu diesem Schluss bin ich gerade durch Versuch und Irrtum gekommen: Runat = "server" wird benötigt, um zur Laufzeit auf der Server-Seite zuzugreifen.

Wenn Sie die Daten an den ASP.NET-Webserver senden, werden die als Runat = "Server" genannten Steuerelemente als Dot Net-Objekte in der Serveranwendung dargestellt. Sie können den Code manuell in HTML-Steuerelemente eingeben oder die Option Run As Server verwenden, indem Sie in der Entwurfsansicht mit der rechten Maustaste klicken. __ ASP.NET-Steuerelemente erhalten dieses Attribut automatisch, wenn Sie es aus der Toolbox in die HTML-Steuerelemente ziehen nicht.

0
Carthi