Pourquoi les formulaires Web ASP.NET ont-ils besoin de l'attribut Runat = "Server"?


205

Pourquoi dois-je spécifier runat="server"sur tous mes contrôles ASP.NET quand il s'agit d'un attribut obligatoire et serverest la seule option disponible dans ma connaissance limitée d'ASP.NET, et j'obtiens une erreur si je ne l'utilise pas?

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 y a-t-il une raison sous-jacente?


2
Je suis d'accord avec cette question, pour clarifier un peu plus, «asp:» (et les autres balises que vous spécifiez dans l'en-tête) n'est-il pas suffisant pour analyser? ou le runat est-il touché après que le contrôle a été converti en INPUT, ce qui ne peut pas être distingué des autres HTML? Je pense que runat serait touché alors qu'il est encore sous forme de contrôle serveur ...
fin du

1
Peut-être que l'ajout d'une sorte d' option de configuration " attribut par défaut ", qui pourrait être basé sur un préfixe ou un nom Web.config, serait une solution de contournement appropriée. Pendant le processus d'analyse, les attributs par défaut peuvent être injectés dans le DOM si nécessaire. Je vais jouer avec cette idée ...
Dan Lugg

Réponses:


112

J'ai toujours cru que c'était plus pour la compréhension que vous pouvez mélanger des balises ASP.NET et des balises HTML, et les balises HTML ont la possibilité d'être runat="server"ou non. Il n'y a rien de mal à laisser la balise, et cela provoque une erreur du compilateur pour la supprimer. Plus vous impliquez de choses sur le langage Web, moins il est facile pour un programmeur en herbe de venir l'apprendre. C'est aussi une bonne raison que n'importe laquelle d'être bavarde sur les attributs des balises.

Cette conversation a eu lieu sur le blog de Mike Schinkel entre lui et Talbot Crowell de Microsoft National Services. Les informations pertinentes sont ci-dessous (premier paragraphe paraphrasé en raison d'erreurs grammaticales dans la source):

[...] mais l'importance de <runat="server">est davantage pour la cohérence et l'extensibilité.

Si le développeur doit marquer certaines balises (à savoir <asp: />) pour que le moteur ASP.NET l'ignore, il y a également le problème potentiel des collisions d'espace de noms entre les balises et les améliorations futures. En exigeant l' <runat="server">attribut, cela est annulé.

Ça continue:

Si cela <runat=client>était nécessaire pour toutes les balises côté client, l'analyseur aurait besoin d'analyser toutes les balises et de supprimer la <runat=client>pièce.

Il continue:

Actuellement, si ma supposition est correcte, l'analyseur ignore simplement tout le texte (balises ou pas de balises) à moins qu'il ne s'agisse d'une balise avec l' runat=serverattribut ou d'un <%préfixe " " ou ssi " <!– #include(...) De plus, puisque ASP.NET est 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 concepteur Web pour placer HTML et JavaScript côté client sans avoir à connaître ASP.NET balises ou attributs spécifiques.


59
Quelle que soit la raison, il s'agit toujours d'un PITA devant le taper pour chaque balise <asp:> alors qu'il peut être en toute sécurité la valeur par défaut.
belugabob

33

Je n'aime généralement pas deviner, mais je vais le faire sur celui-ci ...

Si vous vous souvenez du battage publicitaire de Microsoft .NET à l'époque (2001?), Il était difficile de dire ce qu'était .NET. C'était un serveur? une plateforme de programmation? une langue? quelque chose de complètement nouveau? Compte tenu des publicités, c'était ambiguë tout ce que vous vouliez que ce soit - cela résolvait 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 au runtime .NET. runat = "server" n'est qu'un vestige résiduel, laissé derrière parce que son équivalent côté client n'a jamais atteint la production.

Rappelez-vous ces publicités étranges?

Connexes: article du registre avec un peu d'histoire .NET.


5
Vous arrive-t-il d'avoir un lien vers un site qui contient l'une des "publicités étranges"?
RandomWebGuy

Oui, je me souviens des publicités étranges. soupir
catfood

13

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

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

C'est essentiellement la même chose que:

<asp:Button runat=server />

Supprimez la balise runat = server de la première et vous disposez d'un bouton HTML standard qui s'exécute dans le navigateur. Il existe des raisons pour et contre l'exécution d'un contrôle particulier sur le serveur, et il n'y a aucun moyen pour ASP.NET «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 <asp:XXX />famille de contrôles, mais je suppose que Microsoft considérerait qu'un piratage de la syntaxe de balisage et du moteur ASP.NET.


2
Si un contrôle s'exécute sur le serveur, cela signifie-t-il que vous ne pouvez pas sélectionner les éléments à l'aide de Javascript? par exemple document.getElementsById ("tvns: treeview");
Ciaran Gallagher

3
L'élément sera toujours dans le DOM du client, il est donc toujours possible de le modifier en utilisant javascript / jQuery. Cependant, travailler avec des éléments rendus par le serveur peut être délicat, en particulier avec les contrôles dynamiques.
Dave Swersky

8

Article Microsoft Msdn The Forgotten Controls: HTML Server Controls explique l'utilisation de runat = "server" avec un exemple sur la zone de texte <input type="text">en le convertissant en<input type="text" id="Textbox1" runat="server">

Cela vous donnera un accès par programme à l'élément HTML sur le serveur avant que la page Web ne soit créée et envoyée au client. L'élément HTML doit contenir un attribut id. Cet attribut sert d'identité pour l'élément et vous permet de programmer les éléments par leurs ID spécifiques. En plus de cet attribut, 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 permettre l'accès par programmation à l'élément HTML, ajoutez- runat="server"y.


2
Ne répond pas à la question, qui demande pourquoi runat = "server" est obligatoire sur les balises ASP.NET.
nhahtdh

3
@nhahtdh La réponse est: "pour permettre l'accès programmatique à l'élément HTML". :)
Développeur Marius Žilėnas

2
L'OP sait ce que signifie la balise et ce qu'elle fait. La question se pose en termes de conception de langage - ce qui fait que le concepteur décide que même les balises ASP.NET doivent être marquées avec runat = "server" pour être exécutées côté serveur.
nhahtdh

@nhahtdh quelle est votre réponse?
Développeur Marius Žilėnas

2
Je n'ai pas de réponse, mais les meilleures réponses répondent à la question (correcte ou non). Votre réponse ne fait pas, et c'est la raison de mon commentaire.
nhahtdh

3

Je soupçonne que cela a à voir avec la façon dont les contrôles côté serveur sont identifiés pendant le traitement. Plutôt que d'avoir à vérifier chaque contrôle lors de l'exécution par nom pour déterminer si le traitement côté serveur doit être effectué, il sélectionne la représentation du nœud interne par balise. Le compilateur vérifie que tous les contrôles qui nécessitent des balises de serveur en ont pendant l'étape de validation.


2

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 runat="server"attribut à l'élément HTML. Cet attribut indique que l'élément doit être traité comme un contrôle serveur.


1

C'est là parce que tous les contrôles dans ASP .NET héritent de System.Web.UI.Control qui a l'attribut "runat".

dans la classe System.Web.UI.HTMLControl, l'attribut n'est pas requis, cependant, dans la classe System.Web.UI.WebControl, l'attribut est requis.

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 qu'une balise spécifique doit être exécutée côté serveur. si cet attribut n'était pas là, il ne saurait pas d'abord le traiter sur le serveur. s'il n'est pas là, il suppose qu'il s'agit d'un balisage régulier et le transmet au client.


3
Votre réponse est la question même reformulée.
Pablo Fernandez

2
Ma réponse était simplement de déclarer que l'attribut runat est là en raison de l'héritage. Mes excuses pour ne pas être clair.
Russ Bradberry

3
Un peu trop haut dans la pile, je le crains, ma question était de savoir pourquoi il était là en premier lieu. Merci quand même
johnc

2
Encore une fois, je ne
réponds

1

Je pense que Microsoft peut corriger cette ambiguïté en obligeant le compilateur à ajouter l'attribut runat avant que la page ne soit jamais compilée, quelque chose comme la chose d'effacement de type que java a avec les génériques, au lieu de l'effacer, il pourrait écrire runat = server partout où il voit asp: préfixe pour les balises, donc le développeur n'aurait pas à s'en soucier.


1

Si vous l'utilisez sur des balises html normales, cela signifie que vous pouvez les manipuler par programme dans les gestionnaires d'événements, etc., par exemple changer la href ou la classe d'une balise d'ancrage au chargement de la page ... ne le faites que si vous le devez, car les balises html vanilla aller plus vite.

En ce qui concerne les contrôles utilisateur et les contrôles serveur, non, ils ne fonctionneront tout simplement pas sans eux, sans avoir plongé dans les entrailles du préprocesseur aspx, ne pouvaient pas dire exactement pourquoi, mais devinaient que pour de bonnes raisons, ils écrivaient simplement l'analyseur de cette façon, à la recherche de choses explicitement marquées comme "faire quelque chose".

Si @JonSkeet se trouve quelque part, il sera probablement en mesure de fournir une bien meilleure réponse.


0

Lors de la soumission des données au serveur Web ASP.NET, les contrôles mentionnés comme Runat = «serveur» seront représentés comme des objets Dot Net dans l'application serveur. Vous pouvez saisir manuellement le code dans les contrôles HTML ou utiliser l' option Exécuter en tant que serveur en cliquant avec le bouton droit en mode Création. Les contrôles ASP.NET obtiendront automatiquement cet attribut une fois que vous le faites glisser depuis la boîte à outils, ce qui n'est généralement pas le cas des contrôles HTML.


0

Attribut assez redondant, étant donné que la balise "asp" est évidemment un élément ASP et devrait suffire à l'identifier comme un élément accessible côté serveur.

Ailleurs, cependant, il élevait les balises normales à utiliser dans le code-behind.


0

Je viens d'arriver à cette conclusion par essais et erreurs: runat = "server" est nécessaire pour accéder aux éléments au moment de l'exécution côté serveur. Retirez-les, recompilez et regardez ce qui se passe.


-5

runat="Server" indique qu'une publication sur le serveur se produira pour le "contrôle" HTML.

Les formulaires Web sont postbackconstamment utilisés pour signaler au serveur de traiter un événement de contrôle de page.

.NET MVCpages NE PAS utiliser postback(sauf pour un formulaire "submit"). MVCrepose sur la JQUERYgestion de la page côté client (évitant ainsi la nécessité de beaucoup de postbackmessages vers le serveur).

Donc: .NETles formulaires Web ... utilisent "runat"beaucoup d'attributs dans le balisage de page.

.NET MVCn'utilise presque jamais d' "runat"attribut dans le balisage de page.

J'espère que cela aide à clarifier pourquoi runatest nécessaire ...


1
-1 Faits inexacts et ne répond pas à la question.
Cristian Diaconescu
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.