Pourquoi dois-je spécifier runat="server"
sur tous mes contrôles ASP.NET quand il s'agit d'un attribut obligatoire et server
est 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?
asp.net
runatserver
johnc
la source
la source
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 ...Réponses:
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):
Ça continue:
Il continue:
la source
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.
la source
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.la source
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">
En bref, pour permettre l'accès par programmation à l'élément HTML, ajoutez-
runat="server"
y.la source
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.
la source
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.la source
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.
la source
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.
la source
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.
la source
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.
la source
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.
la source
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.
la source
runat="Server"
indique qu'une publication sur le serveur se produira pour le "contrôle" HTML.Les formulaires Web sont
postback
constamment utilisés pour signaler au serveur de traiter un événement de contrôle de page..NET
MVC
pages NE PAS utiliserpostback
(sauf pour un formulaire"submit"
).MVC
repose sur laJQUERY
gestion de la page côté client (évitant ainsi la nécessité de beaucoup depostback
messages vers le serveur).Donc:
.NET
les formulaires Web ... utilisent"runat"
beaucoup d'attributs dans le balisage de page..NET
MVC
n'utilise presque jamais d'"runat"
attribut dans le balisage de page.J'espère que cela aide à clarifier pourquoi
runat
est nécessaire ...la source