Frage

Warum muß ich runat="server" auf all meinem ASP.NET-Steuerelemente angeben, wenn es ein obligatorisches Attribut ist und server ist die einzige Option in meiner begrenzten Kenntnis von ASP.NET, und ich erhalte eine Fehlermeldung, wenn ich nicht verwenden es?

Ich verstehe, dass ich es optional auf meinen HTML-Tags verwenden kann, und ich tue, um den Client / Server-Paradigma verstehen und was es tatsächlich angeben.

Ist es einen redundanten Tag, das nur durch die Kontrolle impliziert werden könnte eine ASP.NET Kontrolle zu sein, oder ist es ein zugrunde liegender Grund?

War es hilfreich?

Lösung

Ich habe immer geglaubt, es ist mehr für das Verständnis, dass Sie ASP.NET-Tags und HTML-Tag mischen und HTML-Tags haben die Möglichkeit, entweder zu sein runat="server" oder nicht. Es hat nichts schaden den Tag in verlassen, und es führt zu einem Compiler-Fehler, um sie aus. Je mehr Dinge, die Sie über die Web-Sprache bedeuten, ist das weniger leicht es für einen angehenden Programmierer zu kommen und es lernen. Das ist ein so guter Grund, wie jede ausführlichen über Tag-Attribut zu sein.

rel="noreferrer"> Blog zwischen sich und Talbot Crowell von Microsoft National Services

Dieses Gespräch auf Mike Schinkels

  

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

     

Wenn der Entwickler einige Tags markieren hat (nämlich. <asp: />) für die ASP.NET-Engine zu ignorieren, dann gibt es auch die mögliche Ausgabe von Namensraum Kollisionen unter Tags und zukünftige Erweiterungen. Durch die Forderung, das <runat="server"> Attribut wird dies negiert wird.

Weiter heißt es:

  

Wenn <runat=client> für alle clientseitigen Tags erforderlich war, die Parser müßten alle Tags parsen und den <runat=client> Teil Streifen aus.

Er fährt fort:

  

Derzeit   Wenn meine Vermutung richtig ist, der Parser   einfach ignoriert alle Text (Tags oder nein   Tags), es sei denn es ist ein Tag mit der ist   runat=server Attribut oder ein „<%“   Präfix oder ssi „<!– #include ... (...)   Auch ist es, da ASP.NET entwickelt, um   ermöglicht die Trennung der Web-Designer   (Foo.aspx) von dem Web-Entwickler   (Foo.aspx.vb), die Web-Designer können   nutzen, um ihre eigenen Web-Designer-Tools   Platz HTML und clientseitige JavaScript   ohne sich um ASP.NET kennen   bestimmte Tags oder Attribute.

Andere Tipps

Nicht alle Steuerelemente, die in einer Seite enthalten sein kann, muss auf dem Server ausgeführt werden. Zum Beispiel:

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

Dies ist im Wesentlichen der gleiche wie:

<asp:Button runat=server />

Entfernen Sie die runat = Server-Tag von der ersten und Sie haben eine Standard-HTML-Schaltfläche, die im Browser läuft. Es gibt Gründe für und gegen eine bestimmte Steuerung auf dem Server ausgeführt wird, und es gibt keine Möglichkeit für ASP.NET zu „übernehmen“, was wollen Sie basiert auf dem HTML-Markup Sie umfassen. Es könnte möglich sein, zu „schließen“ die runat = Server für die <asp:XXX /> Familie von Kontrollen, aber meine Vermutung ist, dass Microsoft, dass ein Hack auf die Markup-Syntax und ASP.NET-Engine in Betracht ziehen würde.

Microsoft MSDN-Artikel Die vergessene Controls: HTML-Serversteuerelementen Verwendung erklärt von runat = „server“ mit einem Beispiel auf Textfeld <input type="text"> durch Umwandlung <input type="text" id="Textbox1" runat="server">

  

Auf diese Weise wird Ihnen programmatischen Zugriff auf das HTML-Element auf   der Server vor der Web-Seite erstellt und unten an den Client gesendet.   Das HTML-Element muss ein id-Attribut enthalten. Dieses Attribut dient   als Identität für das Element und ermöglicht es Ihnen, Elemente zu programmieren   durch ihre spezifische IDs. Zusätzlich zu diesem Attribut, das HTML-Element   enthalten Runat muss = "server". Dies teilt den Verarbeitungsserver, die das    -Tag wird auf dem Server verarbeitet und nicht ein zu betrachten   traditionelles HTML-Element.

Kurz gesagt, programmatischen Zugriff auf das HTML-Element hinzufügen runat="server", um es zu aktivieren.

Mein Verdacht ist, dass es zu tun hat mit, wie serverseitige Kontrollen während der Verarbeitung identifiziert werden. Anstatt jede Steuerung zur Laufzeit nach dem Namen zu überprüfen, um zu bestimmen, ob die serverseitige Verarbeitung durchgeführt werden muss, hat es eine Auswahl auf der interne Knotendarstellung nach Tag. Der Compiler überprüft, um sicherzustellen, dass alle Steuerelemente, die Server-Tags benötigen sie während der Validierungsschritt haben.

HTML-Elemente in ASP.NET-Dateien werden standardmäßig als Text behandelt. Um diese Elemente programmierbar zu machen, ein runat="server" Attribut in das HTML-Element hinzuzufügen. Dieses Attribut gibt an, dass das Element sollte als Server Kontrolle behandelt werden.

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

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

Bearbeiten lassen Sie mich genauer sein. da asp.net so ziemlich ein abstrakte von HTML ist, muss der Compiler eine Art Richtlinie, so dass es weiß, dass bestimmte Tag-Server-Seite ausgeführt werden muss. wenn das Attribut nicht da ist, dann würde, ist nicht wissen, dass es auf dem Server zuerst zu verarbeiten. wenn sie nicht da ist es nimmt sie regelmäßig Markup ist und übergibt sie an den Client.

Ich denke, dass Microsoft diese Mehrdeutigkeit, indem die Compiler Runat Attribut hinzufügen beheben kann, bevor die Seite jemals kompiliert wird, so etwas wie die Art Löscht Sache, dass Java mit dem Generika hat, statt zu löschen, könnte es runat = Server schreiben wo immer es sieht asp:. Präfix für Tags, so müssen die Entwickler nicht darum kümmern

Wenn Sie es auf normalen HTML-Tags verwenden, bedeutet dies, dass Sie programmatisch sie in Event-Handler usw. manipulieren können, zB die href oder Klasse eines Anker-Tag beim Laden der Seite ändern ... nur tun, wenn Sie zu haben, weil Vanille-hTML-Tags schneller gehen.

Soweit Bedienelemente und Server-Steuerelemente, nein, sie ohne sie nur nicht funktionieren, ohne in die Innereien des aspx Präprozessor vertieft zu haben, nicht genau sagen konnte, warum, würde aber eine Vermutung, dass für wahrscheinlich gute Gründe nehmen, sie schrieben nur den Parser, die Art und Weise, für Dinge suchen explizit als „etwas tun“ gekennzeichnet.

Wenn @JonSkeet um überall ist, wird er wahrscheinlich in der Lage sein, eine viel bessere Antwort zu geben.

Wenn Sie die Daten auf ASP.NET Web Server Vorlage der genannten Kontrollen als Runat = „Server“ als Dot Net Objekte in Server-Anwendung dargestellt werden. Sie können manuell den Code in HTML-Steuerelemente eingeben oder kann sonst verwenden Ausführen als Server Option durch einen Rechtsklick in der Entwurfsansicht. ASP.NET-Steuerelemente automatisch dieses Attribut erhalten, sobald Sie es aus Toolbox ziehen, wo in der Regel HTML-Steuerelemente nicht.

Pretty redundantes Attribut, das „asp“ Tages unter Berücksichtigung ist offensichtlich ein Element ASP und soll genug sein, um es als Server-Seite zugänglich Element zu identifizieren.

In anderen Ländern aber es verwendet, um normale Tags zu erheben in der Code-Behind verwendet werden.

Ich komme gerade zu dieser Schlussfolgerung durch Trial-and-error: Runat = „server“ benötigt wird, um die Elemente zur Laufzeit auf Server-Seite zuzugreifen. Entfernen Sie sie, neu kompilieren und beobachten, was passiert.

runat="Server" zeigt ein Postback an den Server für die HTML auftreten wird "Kontrolle".

Web Forms verwendet postback ständig den Server zu signalisieren, eine Seite Steuer Ereignis zu verarbeiten.

.NET MVC Seiten Verwenden Sie KEINE postback (mit Ausnahme einer Form "submit"). MVC stützt sich auf JQUERY die Seite, auf der Client-Seite zu verwalten (und damit die Notwendigkeit für eine Menge postback Nachrichten an den Server zu umgehen).

So: .NET Web Forms ... Verwendung "runat" viel in der Seite Markup-Attribut.

.NET MVC so gut wie nie verwendet "runat" Attribut in der Seite Markup.

Hope, das hilft erklären, warum runat notwendig ist ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top