¿Por qué las formas web ASP.NET necesitan Runat = & # 8220; Server & # 8221; ¿atributo?

StackOverflow https://stackoverflow.com/questions/304290

  •  08-07-2019
  •  | 
  •  

Pregunta

¿Por qué tengo que especificar runat = " server " en todos mis controles ASP.NET cuando es un atributo obligatorio y server es la única opción disponible en mi conocimiento limitado de ASP.NET, y recibo 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 que el control es un control ASP.NET, o hay una razón subyacente?

¿Fue útil?

Solución

Siempre he creído que estaba allí más para entender que puede 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 coherente y extensible.

     

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

Continúa:

  

Si se requiere < runat = client > para todas las etiquetas del lado del cliente, el analizador necesitaría analizar todas las etiquetas y eliminar el < runat = client > parte.

Él continúa:

  

Actualmente,   Si mi suposición es correcta, el analizador   simplemente ignora todo el texto (etiquetas o no   etiquetas) a menos que sea una etiqueta con el    runat = server o un atributo " <% "   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   utilizar 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.

Otros consejos

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 lo que querías 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 = " servidor " 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 del Registro con algo de historia de .NET .

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 quieras en función del marcado HTML que incluyas. Podría ser posible "inferir" el servidor runat = para la familia de controles < asp: XXX / > , pero supongo que Microsoft consideraría que es un hack a la sintaxis de marcado y al motor ASP.NET.

El artículo de Microsoft Msdn Los controles olvidados: controles del servidor HTML explica el uso de runat = " servidor " con un ejemplo en el cuadro de texto < input type = " text " > convirtiéndolo en < input type = " text " id = " Cuadro de texto1 " runat = " servidor " >

  

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 en elementos   por sus identificaciones específicas. Además de este atributo, el elemento HTML   debe contener runat = " servidor " ;. Esto le dice al servidor de procesamiento que el    la etiqueta se procesa en el servidor y no debe considerarse una   elemento HTML tradicional.

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

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 se debe 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.

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

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

en la clase System.Web.UI.HTMLControl, el atributo no es obligatorio, sin embargo, en la clase System.Web.UI.WebControl, el atributo 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.

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, para que el desarrollador no tenga que preocuparse por eso.

Si lo usa en etiquetas html normales, significa que puede manipularlas mediante programación 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 de vainilla van 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 supongo 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.

Al enviar los datos al servidor web ASP.NET, los controles mencionados como Runat = & # 8220; server & # 8221; se representará 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.

Atributo bastante redundante, considerando el " asp " obviamente, la etiqueta es 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.

Acabo de llegar a esta conclusión por prueba y error: runat = " servidor " 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.

runat = " Servidor " indica que se producirá una devolución de datos al servidor para el control HTML "

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

Las páginas

.NET MVC NO utilizan postback (excepto para un formulario " submit " ). MVC se basa en JQUERY para administrar la página en el lado del cliente (evitando así la necesidad de muchos mensajes postback al servidor).

Entonces: .NET Web Forms ... use mucho el atributo " runat " en el marcado de la página.

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

Espero que esto ayude a aclarar por qué runat es necesario ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top