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

205

Warum muss ich runat="server"auf allen meinen ASP.NET-Steuerelementen angeben, serverob es sich um ein obligatorisches Attribut handelt und die einzige Option ist, die in meinen begrenzten Kenntnissen über ASP.NET verfügbar ist, und ich erhalte eine Fehlermeldung, wenn ich es nicht verwende?

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

Handelt es sich um ein redundantes Tag, das nur impliziert werden könnte, wenn das Steuerelement ein ASP.NET-Steuerelement ist, oder liegt ein Grund zugrunde?

Johnc
quelle
2
Ich stimme dieser Frage zu, um ein wenig mehr zu klären. Ist 'asp:' (und andere Tags, die Sie in der Kopfzeile angeben) nicht genug, um sie zu analysieren? oder wird der Runat getroffen, nachdem das Steuerelement in einen INPUT konvertiert wurde, wodurch er nicht von anderem HTML zu unterscheiden ist? Ich würde denken, Runat würde getroffen werden, solange es noch in Serversteuerungsform ist ...
Abbruch
1
Vielleicht wäre das Hinzufügen einer Art " Standardattribut " -Konfigurationsoption, die auf Präfixen oder Namen basieren Web.configkönnte, eine geeignete Problemumgehung. Während des Analyseprozesses können bei Bedarf Standardattribute in das DOM eingefügt werden. Ich werde mit dieser Idee spielen ...
Dan Lugg

Antworten:

112

Ich habe immer geglaubt, dass es mehr für das Verständnis gibt, dass Sie ASP.NET-Tags und HTML-Tags mischen können und HTML-Tags die Option haben, entweder zu sein runat="server"oder nicht. Es tut nichts weh, das Tag zu belassen, und es verursacht einen Compilerfehler, um es zu entfernen. Je mehr Dinge Sie über die Web-Sprache sagen, desto weniger einfach ist es für einen angehenden Programmierer, sie zu lernen. Das ist so gut wie jeder Grund, ausführlich über Tag-Attribute 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 von Grammatikfehlern in der Quelle umschrieben):

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

Wenn der Entwickler einige Tags markieren muss (z. B. <asp: />), damit die ASP.NET-Engine sie ignoriert, besteht auch das potenzielle Problem von Namespace-Kollisionen zwischen Tags und zukünftigen Verbesserungen. Durch das Erfordernis des <runat="server">Attributs wird dies negiert.

Es geht weiter:

Wenn <runat=client>dies für alle clientseitigen Tags erforderlich wäre, müsste der Parser alle Tags analysieren und das <runat=client>Teil entfernen .

Er fährt fort:

Derzeit, wenn meine Vermutung richtig ist, ignoriert der Parser einfach den gesamten Text (Tags oder keine Tags), es sei denn, es handelt sich um ein Tag mit dem runat=serverAttribut oder einem " <%" Präfix oder ssi " <!– #include... (...) Auch, da ASP.NET entworfen wurde Um die Trennung der Webdesigner (foo.aspx) von den Webentwicklern (foo.aspx.vb) zu ermöglichen, können die Webdesigner ihre eigenen Webdesigner-Tools verwenden, um HTML und clientseitiges JavaScript zu platzieren, ohne über ASP.NET Bescheid zu wissen bestimmte Tags oder Attribute.

George Stocker
quelle
59
Was auch immer der Grund sein mag, es ist immer noch eine PITA, die es für jedes <asp:> -Tag eingeben muss, wenn es sicher der Standardwert sein könnte.
Belugabob
33

Normalerweise rate ich nicht gern, aber ich werde es tun ...

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 alles, was Sie wollten - es löste nur jedes Problem, das Sie haben könnten.

Ich vermute also, dass es eine versteckte Vision gab, dass ASP.NET-Code überall ausgeführt werden kann - serverseitig oder clientseitig, in einer Kopie von Internet Explorer, die an die .NET-Laufzeit gebunden ist. runat = "server" ist nur ein Überbleibsel, das zurückgelassen wurde, weil sein clientseitiges Äquivalent es nie in die Produktion geschafft hat.

Erinnerst du dich an diese seltsamen Anzeigen?

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

Corbin März
quelle
5
Haben Sie zufällig einen Link zu einer Website mit einer der "seltsamen Anzeigen"?
RandomWebGuy
Ja, ich erinnere mich an die seltsamen Anzeigen. Seufzer
Katzenfutter
13

Nicht alle Steuerelemente, die in einer Seite enthalten sein können, müssen auf dem Server ausgeführt werden. Beispielsweise:

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

Dies ist im Wesentlichen dasselbe wie:

<asp:Button runat=server />

Entfernen Sie das Tag runat = server aus dem ersten und Sie haben eine Standard-HTML-Schaltfläche, die im Browser ausgeführt wird. Es gibt Gründe dafür und dagegen, ein bestimmtes Steuerelement auf dem Server auszuführen, und es gibt für ASP.NET keine Möglichkeit, basierend auf dem von Ihnen eingeschlossenen HTML-Markup "anzunehmen", was Sie möchten. Es könnte möglich sein, den runat = Server für die <asp:XXX />Familie der Steuerelemente zu "schließen" , aber ich vermute, dass Microsoft dies als Hack für die Markup-Syntax und die ASP.NET-Engine betrachten würde.

Dave Swersky
quelle
2
Wenn auf dem Server ein Steuerelement ausgeführt wird, können Sie die Elemente dann nicht mit Javascript auswählen? zB document.getElementsById ("tvns: treeview");
Ciaran Gallagher
3
Das Element befindet sich weiterhin im DOM auf dem Client, sodass es weiterhin mit Javascript / jQuery geändert werden kann. Das Arbeiten mit vom Server gerenderten Elementen kann jedoch schwierig sein, insbesondere mit dynamischen Steuerelementen.
Dave Swersky
8

Microsoft Msdn-Artikel The Forgotten Controls: HTML Server Controls erläutert die Verwendung von runat = "server" anhand eines Beispiels für ein Textfeld, <input type="text">indem es in konvertiert wird<input type="text" id="Textbox1" runat="server">

Auf diese Weise erhalten Sie programmgesteuerten Zugriff auf das HTML-Element auf dem Server, 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 es Ihnen, Elemente anhand ihrer spezifischen IDs zu programmieren. Zusätzlich zu diesem Attribut muss das HTML-Element runat = "server" enthalten. Dies teilt dem Verarbeitungsserver mit, dass das Tag auf dem Server verarbeitet wird und nicht als traditionelles HTML-Element betrachtet werden soll.

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

Entwickler Marius Žilėnas
quelle
2
Behebt nicht die Frage, warum runat = "server" für ASP.NET-Tags obligatorisch ist.
nhahtdh
3
@nhahtdh Die Antwort lautet: "um den programmgesteuerten Zugriff auf das HTML-Element zu ermöglichen". :)
Entwickler Marius Žilėnas
2
Das OP weiß, was das Tag bedeutet und was es tut. Die Frage betrifft das Sprachdesign: Warum entscheidet der Designer, dass selbst ASP.NET-Tags mit runat = "server" markiert werden müssen, um auf der Serverseite ausgeführt zu werden?
nhahtdh
@nhahtdh was ist deine Antwort?
Entwickler Marius Žilėnas
2
Ich habe keine Antwort, aber die Top-Antworten adressieren die Frage (richtig oder nicht). Ihre Antwort nicht, und das ist der Grund für meinen Kommentar.
nhahtdh
3

Mein Verdacht ist, dass es damit zu tun hat, wie serverseitige Steuerelemente während der Verarbeitung identifiziert werden. Anstatt jedes Steuerelement zur Laufzeit anhand seines Namens überprüfen zu müssen, um festzustellen, ob eine serverseitige Verarbeitung durchgeführt werden muss, wird die interne Knotendarstellung nach Tag ausgewählt. Der Compiler überprüft, ob alle Steuerelemente, für die Server-Tags erforderlich sind, diese während des Validierungsschritts haben.

Tvanfosson
quelle
2

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

ShaileshDev
quelle
1

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 so ziemlich eine Zusammenfassung von HTML ist, benötigt der Compiler eine Art Direktive, damit er weiß, dass ein bestimmtes Tag serverseitig ausgeführt werden muss. Wenn dieses Attribut nicht vorhanden wäre, würde es nicht zuerst auf dem Server verarbeitet werden müssen. Wenn es nicht vorhanden ist, wird davon ausgegangen, dass es sich um ein reguläres Markup handelt, und es wird an den Client übergeben.

Russ Bradberry
quelle
3
Ihre Antwort ist genau die Frage, die neu formuliert wurde.
Pablo Fernandez
2
Meine Antwort lautete lediglich, dass das runat-Attribut aufgrund der Vererbung vorhanden ist. Ich entschuldige mich dafür, dass ich nicht klar bin.
Russ Bradberry
3
Ich fürchte, meine Frage war etwas zu hoch im Stapel, warum es überhaupt dort war.
Trotzdem
2
Wieder nicht wirklich die Frage zu beantworten, aber ich sehe, was Sie sagen wollen
Johnc
1

Ich denke, dass Microsoft diese Unklarheit beheben kann, indem der Compiler das Runat-Attribut hinzufügt, bevor die Seite jemals kompiliert wird asp: Präfix für Tags, sodass sich der Entwickler keine Sorgen machen muss.

Stefan
quelle
1

Wenn Sie es für normale HTML-Tags verwenden, bedeutet dies, dass Sie sie programmgesteuert in Ereignishandlern usw. bearbeiten können, z. B. die href oder Klasse eines Ankertags beim Laden der Seite ändern. Tun Sie dies nur, wenn Sie müssen, da Vanille-HTML-Tags geh schneller.

Was Benutzer- und Serversteuerungen angeht, nein, sie funktionieren einfach nicht ohne sie, ohne sich mit den Innereien des Aspx-Präprozessors befasst zu haben. Sie konnten nicht genau sagen, warum, würden aber davon ausgehen, dass sie aus wahrscheinlich guten Gründen gerade geschrieben haben Der Parser sucht auf diese Weise nach Dingen, die explizit als "etwas tun" gekennzeichnet sind.

Wenn @JonSkeet irgendwo in der Nähe ist, kann er wahrscheinlich eine viel bessere Antwort geben.

Seanb
quelle
0

Beim Senden der Daten an den ASP.NET-Webserver werden die als Runat = "Server" genannten Steuerelemente in der Serveranwendung als Dot Net-Objekte dargestellt. Sie können den Code manuell in HTML-Steuerelemente eingeben oder die Option Als Server ausführen verwenden, indem Sie mit der rechten Maustaste in die Entwurfsansicht klicken. ASP.NET-Steuerelemente erhalten dieses Attribut automatisch, sobald Sie es aus der Toolbox ziehen, wo dies normalerweise bei HTML-Steuerelementen nicht der Fall ist.

Carthi
quelle
0

Ziemlich redundantes Attribut, wenn man bedenkt, dass das "asp" -Tag offensichtlich ein ASP-Element ist und ausreichen sollte, um es als serverseitig zugängliches Element zu identifizieren.

An anderer Stelle wurden jedoch normale Tags erhöht, die im CodeBehind verwendet werden sollen.

Kapitän offensichtlich
quelle
0

Ich bin gerade durch Ausprobieren zu diesem Schluss gekommen: runat = "server" wird benötigt, um zur Laufzeit auf der Serverseite auf die Elemente zuzugreifen. Entfernen Sie sie, kompilieren Sie sie neu und beobachten Sie, was passiert.

Jánosi Zoltán János
quelle
-5

runat="Server" Gibt an, dass für das HTML-Steuerelement ein Postback an den Server erfolgt.

Web Forms postbacksignalisieren dem Server ständig, ein Seitensteuerungsereignis zu verarbeiten.

.NET MVCSeiten NICHT verwenden postback(außer für ein Formular "submit"). MVCverlässt sich JQUERYdarauf, die Seite auf der Clientseite zu verwalten (wodurch der Bedarf an vielem umgangen wirdpostback Nachrichten an den Server ).

Also: .NETWeb Forms ... verwenden "runat"Attribute häufig im Seiten-Markup.

.NET MVC kaum jemals verwendet "runat" Attribut im Seiten-Markup.

Hoffe das hilft zu klären warum runates notwendig ist ...

pointcounterpoint
quelle
1
-1 Ungenaue Fakten und beantwortet die Frage nicht.
Cristian Diaconescu