Pourquoi les formulaires Web ASP.NET ont-ils besoin de l’atsortingbut Runat = “Serveur”?

Pourquoi dois-je spécifier runat="server" sur tous mes contrôles ASP.NET lorsque c’est un atsortingbut obligatoire et que le server est la seule option disponible dans ma connaissance limitée d’ASP.NET, et je reçois une erreur si je ne le fais pas utilise le?

Je comprends que je peux éventuellement l’utiliser sur mes balises HTML, et je comprends le paradigme client / serveur et ce qu’il spécifie réellement.

Est-ce une balise redondante qui pourrait simplement être impliquée par le contrôle étant un contrôle ASP.NET, ou existe-t-il une raison sous-jacente?

J’ai toujours pensé que c’était là plus pour comprendre que vous pouviez combiner des balises ASP.NET et des balises HTML, et que les balises HTML ont la possibilité d’être runat="server" ou non. Cela ne fait pas de mal de laisser la balise, et cela provoque une erreur de compilation. Plus vous impliquez de choses sur le langage Web, moins il est facile pour un programmeur en herbe de l’apprendre. C’est une bonne raison d’être verbeux sur les atsortingbuts de balise.

Cette conversation a eu lieu sur le blog de Mike Schinkel entre lui-même et Talbot Crowell de Microsoft National Services. L’information pertinente est ci-dessous (premier paragraphe paraphrasé en raison d’erreurs grammaticales dans la source):

[…] mais l’importance de est plus importante pour la cohérence et l’extensibilité.

Si le développeur doit marquer certaines balises (à savoir, ) pour que le moteur ASP.NET les ignore, il existe également un problème potentiel de collisions entre les balises et les améliorations futures. En exigeant l’atsortingbut , ceci est annulé.

Il continue:

Si était requirejs pour toutes les balises côté client, l’parsingur devrait parsingr toutes les balises et supprimer la partie .

Il continue:

Actuellement, si mon estimation est correcte, l’parsingur ignore simplement tout le texte (balises ou pas de balises) à moins qu’il ne s’agisse d’une balise avec l’atsortingbut runat=server ou un préfixe ” <% " ou ssi " (.. .) En outre, ASP.NET étant conçu pour permettre la séparation des concepteurs Web (foo.aspx) des développeurs Web (foo.aspx.vb), les concepteurs Web peuvent utiliser leurs propres outils de conception Web pour placer du code HTML et des informations client. côté JavaScript sans avoir à connaître les balises ou atsortingbuts spécifiques à ASP.NET.

Je n’aime généralement pas deviner, mais je vais sur celui-ci …

Si vous vous rappelez le battage publicitaire de Microsoft .NET dans le passé (2001?), Il était difficile de dire ce que c’était .NET. Était-ce un serveur? une plateforme de programmation? une langue? quelque chose de nouveau entièrement? Compte tenu des annonces, tout était ambigu, tout ce que vous souhaitiez – cela résout tout problème que vous pourriez avoir.

Donc, je suppose qu’il y avait une grande vision cachée que le code ASP.NET pouvait s’exécuter n’importe où – côté serveur OU côté client, dans une copie d’Internet Explorer liée à l’environnement d’exécution .NET. runat = “server” est juste un vestige résiduel, parce que son équivalent côté client n’a jamais été produit.

Rappelez-vous ces publicités étranges?

Related: Article du registre avec une certaine histoire .NET.

Tous les contrôles pouvant être inclus dans une page ne doivent pas être exécutés sur le serveur. Par exemple:

Ceci est essentiellement le même que:

Supprimez le tag runat = server du premier et vous disposez d’un bouton HTML standard qui s’exécute dans le navigateur. Il y a des raisons pour et contre l’exécution d’un contrôle particulier sur le serveur, et ASP.NET n’a aucun moyen d’assumer ce que vous voulez en fonction du balisage HTML que vous incluez. Il pourrait être possible de “déduire” le serveur runat = pour la famille de contrôles , mais je pense que Microsoft considérerait cela comme un piratage de la syntaxe de balisage et du moteur ASP.NET.

Article Microsoft Msdn Les contrôles oubliés: contrôles du serveur HTML expliquent l’utilisation de runat = “server” avec un exemple de zone de texte en le convertissant en

Cela vous donnera un access par programme à l’élément HTML sur le serveur avant que la page Web soit créée et envoyée au client. L’élément HTML doit contenir un atsortingbut id. Cet atsortingbut sert d’identité pour l’élément et vous permet de programmer des éléments selon leurs identifiants spécifiques. En plus de cet atsortingbut, l’élément HTML doit contenir runat = “server”. Cela indique au serveur de traitement que la balise est traitée sur le serveur et ne doit pas être considérée comme un élément HTML traditionnel.

En bref, pour activer l’access par programme à l’élément HTML, ajoutez runat="server" à celui-ci.

Mon soupçon est que cela a à voir avec la façon dont les contrôles côté serveur sont identifiés lors du traitement. Plutôt que de devoir vérifier chaque contrôle à l’exécution pour déterminer si le traitement côté serveur doit être effectué, il effectue une sélection sur la représentation du noeud interne par étiquette. Le compilateur vérifie que tous les contrôles nécessitant des balises serveur les ont lors de l’étape de validation.

Les éléments HTML des fichiers ASP.NET sont, par défaut, traités comme du texte. Pour rendre ces éléments programmables, ajoutez un atsortingbut runat="server" à l’élément HTML. Cet atsortingbut indique que l’élément doit être traité comme un contrôle serveur.

C’est parce que tous les contrôles dans ASP .NET héritent de System.Web.UI.Control qui a l’atsortingbut “runat”.

Dans la classe System.Web.UI.HTMLControl, l’atsortingbut n’est pas obligatoire, cependant, dans la classe System.Web.UI.WebControl, l’atsortingbut est requirejs.

edit: permettez-moi d’être plus précis. Comme asp.net est à peu près un résumé de HTML, le compilateur a besoin d’une sorte de directive pour qu’il sache que cette balise spécifique doit être exécutée côté serveur. Si cet atsortingbut n’était pas là, il ne serait pas possible de le traiter d’abord sur le serveur. si ce n’est pas le cas, cela suppose qu’il s’agit d’un balisage régulier et qu’il est transmis au client.

Je pense que Microsoft peut corriger cette ambiguïté en faisant en sorte que le compilateur ajoute un atsortingbut runat avant que la page ne soit compilée, quelque chose comme le type d’effacement que java a avec les génériques. asp: préfixe pour les tags, le développeur n’aura donc pas à s’en préoccuper.

Si vous l’utilisez sur des balises HTML normales, cela signifie que vous pouvez les manipuler par programmation dans des gestionnaires d’événements, par exemple changer le href ou la classe d’une balise d’ancrage sur le chargement de page … ne le faites que si aller plus vite.

En ce qui concerne les contrôles utilisateur et les contrôles serveur, non, ils ne travailleraient pas sans eux, sans se plonger dans les entrailles du préprocesseur aspx, ne pouvaient pas dire exactement pourquoi, mais l’parsingur de cette façon, à la recherche de choses explicitement marquées comme “faire quelque chose”.

Si @JonSkeet est présent partout, il sera probablement en mesure de fournir une meilleure réponse.

Lors de la soumission des données au serveur Web ASP.NET, les contrôles mentionnés sous Runat = “server” seront représentés en tant qu’objects Dot Net dans l’application serveur. Vous pouvez taper manuellement le code dans les contrôles HTML ou utiliser l’option Exécuter en tant que serveur en cliquant avec le bouton droit de la souris sur la vue de conception. Les contrôles ASP.NET obtiendront automatiquement cet atsortingbut une fois que vous le faites glisser depuis la boîte à outils, contrairement aux contrôles HTML.

Atsortingbut plutôt redondant, considérer la balise “asp” est évidemment un élément ASP et devrait être suffisant pour l’identifier en tant qu’élément accessible côté serveur.

Ailleurs, cependant, il utilisait des balises normales pour être utilisées dans le code-behind.

Je viens d’arriver à cette conclusion par un essai et une erreur: runat = “server” est nécessaire pour accéder aux éléments lors de l’exécution du côté serveur. Retirez-les, recomstackz et observez ce qui se passe.

runat="Server" indique qu’une publication sur le serveur aura lieu pour le “contrôle” HTML.

Web Forms utilise constamment le postback pour signaler au serveur de traiter un événement de contrôle de page.

.NET pages .NET MVC n’utilisent PAS le postback (sauf pour un formulaire "submit" ). MVC s’appuie sur JQUERY pour gérer la page côté client ( JQUERY ainsi de nombreux messages postback sur le serveur).

Donc: .NET Web Forms … utilise beaucoup l’atsortingbut "runat" dans le balisage de la page.

.NET MVC n’utilise presque jamais l’atsortingbut "runat" dans le balisage de la page.

J’espère que cela aide à comprendre pourquoi runat est nécessaire …