¿Por qué las formas web ASP.NET necesitan el atributo Runat = "Servidor"?

205

¿Por qué debo especificar runat="server"en todos mis controles ASP.NET cuando es un atributo obligatorio y serveres la única opción disponible en mi conocimiento limitado de ASP.NET, y obtengo un error si no lo uso?

Entiendo que opcionalmente puedo usarlo en mis etiquetas HTML, y entiendo el paradigma cliente / servidor y lo que realmente está especificando.

¿Es una etiqueta redundante que podría implicar simplemente que el control es un control ASP.NET, o hay una razón subyacente?

johnc
fuente
2
Estoy de acuerdo con esta pregunta, para aclarar un poco más, ¿no es 'asp:' (y otras etiquetas que especifique en el encabezado) lo suficiente para analizar? o ¿se está golpeando el runat después de que el control se haya convertido en una ENTRADA, por lo que no se puede distinguir de otro HTML? Creo que Runat sería golpeado mientras todavía está en forma de control de servidor ...
termina el
1
Quizás agregar una especie de opción de configuración de " atributo predeterminado ", que podría estar basada en el prefijo o el nombre Web.config, sería una solución alternativa adecuada. Durante el proceso de análisis, los atributos predeterminados se pueden inyectar en el DOM cuando sea necesario. Voy a jugar con esta idea ...
Dan Lugg

Respuestas:

112

Siempre he creído que estaba allí más para entender que puedes mezclar etiquetas ASP.NET y etiquetas HTML, y las etiquetas HTML tienen la opción de ser runat="server"o no. No hace daño dejar nada la etiqueta, y provoca que un error del compilador lo elimine. Cuanto más implicas sobre el lenguaje web, menos fácil es para un programador en ciernes entrar y aprenderlo. Esa es una razón tan buena como cualquiera para ser detallado sobre los atributos de etiqueta.

Esta conversación tuvo lugar en el Blog de Mike Schinkel entre él y Talbot Crowell de los Servicios Nacionales de Microsoft. La información relevante está debajo (primer párrafo parafraseado debido a errores gramaticales en la fuente):

[...] pero la importancia de <runat="server">es más para la consistencia y la extensibilidad.

Si el desarrollador tiene que marcar algunas etiquetas (a saber <asp: />) para que el motor ASP.NET las ignore, entonces también existe el problema potencial de colisiones de espacio de nombres entre etiquetas y mejoras futuras. Al requerir el <runat="server">atributo, esto se niega.

Continúa:

Si <runat=client>fuera necesario para todas las etiquetas del lado del cliente, el analizador necesitaría analizar todas las etiquetas y quitar la <runat=client>parte.

Él continúa:

Actualmente, si mi suposición es correcta, el analizador simplemente ignora todo el texto (etiquetas o sin etiquetas) a menos que sea una etiqueta con el runat=serveratributo o un <%prefijo " " o ssi " <!– #include... (...) Además, dado que ASP.NET está diseñado Para permitir la separación de los diseñadores web (foo.aspx) de los desarrolladores web (foo.aspx.vb), los diseñadores web pueden usar sus propias herramientas de diseño web para colocar HTML y JavaScript del lado del cliente sin tener que saber sobre ASP.NET Etiquetas o atributos específicos.

George Stocker
fuente
59
Cualquiera sea la razón, sigue siendo un PITA que tiene que escribirlo para cada etiqueta <asp:> cuando podría ser el valor predeterminado de forma segura.
belugabob
33

Por lo general, no me gusta adivinar, pero voy a hacer esto ...

Si recuerdas el bombo publicitario de .NET de Microsoft en el pasado (2001?), Fue difícil saber qué era .NET. ¿Fue un servidor? una plataforma de programación? ¿un idioma? algo completamente nuevo? Teniendo en cuenta los anuncios, era ambiguamente cualquier cosa que quisieras que fuera, simplemente resolvió cualquier problema que pudieras tener.

Entonces, supongo que había una gran visión oculta de que el código ASP.NET podría ejecutarse en cualquier lugar, del lado del servidor O del lado del cliente, en una copia de Internet Explorer vinculada al tiempo de ejecución de .NET. runat = "server" es solo un vestigio remanente, dejado atrás porque su equivalente del lado del cliente nunca llegó a producción.

¿Recuerdas esos anuncios raros?

Relacionado: Artículo de The Register con algo de historia de .NET.

Corbin March
fuente
55
¿Tiene un enlace a un sitio que tiene alguno de los "anuncios extraños"?
RandomWebGuy
Sí, recuerdo los anuncios raros. suspiro
comida para gatos 01 de
13

No todos los controles que se pueden incluir en una página deben ejecutarse en el servidor. Por ejemplo:

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

Esto es esencialmente lo mismo que:

<asp:Button runat=server />

Elimine la etiqueta runat = server de la primera y tendrá un botón HTML estándar que se ejecuta en el navegador. Hay razones a favor y en contra de ejecutar un control particular en el servidor, y ASP.NET no tiene forma de "asumir" lo que desea en función del marcado HTML que incluya. Podría ser posible "inferir" el servidor runat = para la <asp:XXX />familia de controles, pero supongo que Microsoft consideraría que hackea la sintaxis de marcado y el motor ASP.NET.

Dave Swersky
fuente
2
Si se está ejecutando un control en el servidor, ¿eso significa que no puede seleccionar los elementos usando Javascript? por ejemplo, document.getElementsById ("tvns: treeview");
Ciaran Gallagher
3
El elemento seguirá estando en el DOM del cliente, por lo que aún es posible modificarlo usando javascript / jQuery. Sin embargo, trabajar con elementos renderizados por el servidor puede ser complicado, especialmente con controles dinámicos.
Dave Swersky
8

El artículo de Microsoft Msdn The Forgotten Controls: HTML Server Controls explica el uso de runat = "server" con un ejemplo en el cuadro de texto <input type="text">al convertirlo a<input type="text" id="Textbox1" runat="server">

Hacer esto le dará acceso programático al elemento HTML en el servidor antes de que se cree la página web y se envíe al cliente. El elemento HTML debe contener un atributo id. Este atributo sirve como una identidad para el elemento y le permite programar elementos por sus ID específicos. Además de este atributo, el elemento HTML debe contener runat = "server". Esto le dice al servidor de procesamiento que la etiqueta se procesa en el servidor y no debe considerarse un elemento HTML tradicional.

En resumen, para habilitar el acceso programático al elemento HTML, agréguelo runat="server".

Desarrollador Marius Žilėnas
fuente
2
No aborda la pregunta, que se pregunta por qué runat = "server" es obligatorio en las etiquetas ASP.NET.
nhahtdh 01 de
3
@nhahtdh La respuesta es: "para habilitar el acceso programático al elemento HTML". :)
Desarrollador Marius Žilėnas
2
El OP sabe lo que significa la etiqueta y lo que hace. La pregunta es en términos de diseño de lenguaje: qué hace que el diseñador decida que incluso las etiquetas ASP.NET deben marcarse con runat = "server" para ejecutarse en el lado del servidor.
nhahtdh
@nhahtdh ¿cuál es tu respuesta?
Desarrollador Marius Žilėnas
2
No tengo una respuesta, pero las respuestas principales responden a la pregunta (correcta o no). Su respuesta no, y esa es la razón de mi comentario.
nhahtdh
3

Mi sospecha es que tiene que ver con cómo se identifican los controles del lado del servidor durante el procesamiento. En lugar de tener que verificar cada control en tiempo de ejecución por nombre para determinar si es necesario realizar el procesamiento del lado del servidor, realiza una selección en la representación del nodo interno por etiqueta. El compilador verifica para asegurarse de que todos los controles que requieren etiquetas de servidor las tengan durante el paso de validación.

tvanfosson
fuente
2

Los elementos HTML en los archivos ASP.NET, por defecto, se tratan como texto. Para hacer que estos elementos sean programables, agregue un runat="server"atributo al elemento HTML. Este atributo indica que el elemento debe tratarse como un control de servidor.

ShaileshDev
fuente
1

Está allí porque todos los controles en ASP .NET heredan de System.Web.UI.Control que tiene el atributo "runat".

en la clase System.Web.UI.HTMLControl, el atributo no es obligatorio, sin embargo, en la clase System.Web.UI.WebControl es obligatorio.

editar: déjame ser más específico. dado que asp.net es básicamente un resumen de HTML, el compilador necesita algún tipo de directiva para que sepa que la etiqueta específica debe ejecutarse en el lado del servidor. si ese atributo no estuviera allí, entonces no sabría procesarlo primero en el servidor. Si no está allí, se supone que es un marcado regular y se lo pasa al cliente.

Russ Bradberry
fuente
3
Su respuesta es la misma pregunta reformulada.
Pablo Fernández
2
Mi respuesta fue simplemente declarar que el atributo runat está allí debido a la herencia. Mis disculpas por no ser claro.
Russ Bradberry
3
Un poco demasiado alto en la pila, me temo, mi pregunta fue sobre por qué estaba allí en primer lugar. Gracias de todos modos
johnc
2
Una vez más, no es realmente responder a la pregunta, pero veo lo que está tratando de decir
johnc
1

Creo que Microsoft puede solucionar esta ambigüedad haciendo que el compilador agregue el atributo runat antes de que la página se compile, algo así como el borrado de tipo que tiene Java con los genéricos, en lugar de borrar, podría estar escribiendo runat = server donde sea que vea asp: prefijo para etiquetas, por lo que el desarrollador no tendrá que preocuparse por eso.

Stefan
fuente
1

Si lo usa en etiquetas html normales, significa que puede manipularlas programáticamente en controladores de eventos, etc., por ejemplo, cambiar el href o la clase de una etiqueta de anclaje en la carga de la página ... solo haga eso si es necesario, porque las etiquetas html vanilla vaya más rápido.

En cuanto a los controles del usuario y los controles del servidor, no, simplemente no funcionarán sin ellos, sin haber profundizado en las entrañas del preprocesador aspx, no podría decir exactamente por qué, pero supondrían que probablemente por buenas razones, simplemente escribieron el analizador de esa manera, buscando cosas marcadas explícitamente como "hacer algo".

Si @JonSkeet está en alguna parte, probablemente podrá proporcionar una respuesta mucho mejor.

seanb
fuente
0

Al enviar los datos al servidor web ASP.NET, los controles mencionados como Runat = "servidor" se representarán como objetos Dot Net en la aplicación del servidor. Puede escribir manualmente el código en los controles HTML o puede usar la opción Ejecutar como servidor haciendo clic derecho en la vista de diseño. Los controles ASP.NET obtendrán automáticamente este atributo una vez que lo arrastre desde la caja de herramientas donde generalmente los controles HTML no lo hacen.

Carthi
fuente
0

Atributo bastante redundante, teniendo en cuenta que la etiqueta "asp" es obviamente un elemento ASP y debería ser suficiente para identificarlo como un elemento accesible del lado del servidor.

En otros lugares, sin embargo, solía elevar las etiquetas normales para usar en el código subyacente.

captainobvious
fuente
0

Acabo de llegar a esta conclusión por prueba y error: runat = "server" es necesario para acceder a los elementos en tiempo de ejecución en el lado del servidor. Elimínalos, vuelve a compilar y observa lo que sucede.

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

runat="Server" indica que se realizará una devolución al servidor para el "control" HTML.

Los formularios web se usan postbackconstantemente para indicar al servidor que procese un evento de control de página.

.NET MVCNO use las páginas postback(excepto un formulario "submit"). MVCdepende JQUERYde administrar la página en el lado del cliente (evitando así la necesidad de muchos postbackmensajes al servidor).

Entonces: .NETWeb Forms ... usa "runat"mucho el atributo en el marcado de la página.

.NET MVC casi nunca usa "runat" atributo en el marcado de la página.

Espero que esto ayude a aclarar por qué runates necesario ...

punto contrapunto
fuente
1
-1 Hechos inexactos y no responde la pregunta.
Cristian Diaconescu