Una página Web ASP.NET de Formularios es un fichero de texto declarativo con extensión .aspx.
Además del contenido estático, podemos utilizar ocho elementos distintos de marcado.
Los bloques de renderización se denotan con los elementos <% ... %>, y nos permiten controlar de forma personalizada la emisión del contenido y la ejecución, durante el renderizado en la ejecución de las páginas Web con formularios. El siguiente ejemplo nos muestra como podemos usarlos para reallizar iteraciones en el contenido HTML.
<% for (int i=0; i<8; i++) { %>
<font size="<%=i%>"> Hello World! </font> <br>
<% } %>
En código encerrado entre <% ... %> simplemente se ejecuta, mientras que las expresiones que incluyen el signo igual, <%= ... %>, se evaluan y sus resultados se emiten como contenido. De esta forma, <%="Hello World" %> se interpreta igual que el código C# <% Response.Write("Hello World"); %>.
Nota: Para lenguajes que utilizan marcas para finalizar o separar sentencias (por ejemplo el punto y coma (;) en C#), es importante situar bien estas marcas dependiendo de como tiene que ser interpretado el código.
<% Response.Write("Hello World");
%> Es necesario el punto y coma.
<%="Hello World"; %> Mal: Equivaldría a "Response.Write("Hello
World";);".
<%="Hello World" %> El punto y coma no es necesario.
Los bloques de declaración de código definen variables y métodos miembros, que serán compilados en la clase de Página generada. Estos bloques se pueden utilizar para "author" la página y la lógica de navegación. El siguiente ejemplo demuestra como podemos declarar el método Substract en un bloque <script runat="server"> y despues invocarlo desde la página.
<script language="C#" runat=server>
int subtract(int num1, int num2) {
return num1 - num2;
}
</script>
<%
...
number = subtract(number, 1);
...
%>
Importante: A diferencia de ASP -- dónde las funciones se pueden declarar con bloques <% %> -- todas las funciones y variables globales de página tienen que declararse en una etiqueta <script runat=server>. Las funciones declaradas con bloques <% %> generarán un error de compilación.
Los controles de servidor ASP.NET personalizados permiten a los desarrolladores generar dinámicamente la interfaz de usuario (UI) HTML y responder a peticiones de los clientes. Se representan en un fichero utilizando una sintaxis declarativa, basada en etiquetas. Estas etiquetas se distinguen de otras etiquetas porque contienen el atributo "runat=server". El siguiente ejemplo nos demuestra como un control de servidor <asp:label runat="server"> puede ser utilizado en una página ASP.NET. Este control corresponde a la clase Label en el espacio de nombres System.Web.UI.WebControls, que se incluye por defecto.
Añadiendo una etiqueta con el ID "Message", se creará cuando se ejecute una instancia de la clase Label:
<asp:label id="Message" font-size=24 runat="server"/>
El control puede accederse usando el mismo nombre. La siguiente línea establece la propiedad Text del control.
Message.Text = "Bienvenidos a ASP.NET";
Los controles de servidor HTML permiten a los desarrolladores de páginas manipular de forma programada los elementos HTML de una página. Una etiqueta de control de servidor HTML se distingue de los elementos HTML de cliente a través del atributo "runat=server". El siguiente ejemplo demuestra como un control de servidor HTML <span runat=server> se puede usar en un a página ASP.NET.
Como con otros controles de servidor, los métodos y propiedades están accesibles a traves de la programación, como se demuestra en el siguiente ejemplo.
<script language="C#" runat="server">
void Page_Load(Object sender, EventArgs e) {
Message.InnerHtml = "Welcome to ASP.NET";
}
</script>
...
<span id="Message" style="font-size:24" runat="server"/>
El soporte de Enlace en ASP.NET permite a los desarrolladores de páginas enlazar las propiedades de control a valores de los contenedores de datos. El código situado entre bloques <%# %> se ejecutará cuando el método DataBind de su contenedor de control "padre" es invocado. El siguiente ejemplo demuestra como utilizar la sintaxis de enlazado de datos en un control <asp:datalist runat=server>.
En el datalist, se especifica la plantilla para un elemento. El contenido de la plantilla del elemento se especifica utilizando una expresión de enlazado de datos y el Container.DataItem hace referencia a la fuente de datos utilizada por el datalist MyList.
<asp:datalist id="MyList" runat=server>
<ItemTemplate>
Here is a value: <%# Container.DataItem %>
</ItemTemplate>
</asp:datalist>
En este caso, la fuente de datos del control MyList se configura programándola y, posteriormente, se llama a DataBind().
void Page_Load(Object sender, EventArgs e) {
ArrayList items = new ArrayList();
items.Add("One");
items.Add("Two");
items.Add("Three");
MyList.DataSource = items;
MyList.DataBind();
}
La llamada al método DataBind de un control provoca un barrido recursivo desde ese control a lo largo del árbol; el evento Databinding se produce en cada control de servidor de la jerarquía y las expresiones de enlazado de datos del control se evaluan consecuentemente. Es decir, si invocamos el método DataBind de una página todas las expresiones de enlazado de datos de la página serán invocadas.
ASP.NET 2.0 también incluye una nueva sintaxis de databinding simplificada que permite a los controles enlazarse automáticamente a los controles de fuente de datos, sin tener que llamar a DataBind() en el código de la página. Esta sintaxis se trar en la sección de Realizando Acceso a Datos.
Las etiquetas de objeto permiten a los desarrolladores declarar y crear objetos de variables mediante una sintaxis declarativa basada en etiquetas. El siguiente ejemplo muestra como la etiqueta del objeto puede utilizarse para crear una instancia de la clase ArrayList.
<object id="items" class="System.Collections.ArrayList" runat="server"/>
El objeto será creado automáticamente en tiempo de ejecución y podrá ser accedido mediante el ID "items".
void Page_Load(Object sender, EventArgs e) {
items.Add("One");
items.Add("Two");
items.Add("Three");
...
}
Los comentarios del lado del servidor permiten a los desarrolladores evitar la ejecución y rederizado de código de servidor (incluyendo controles de servidor) y de contenido estático. El siguiente ejemplo muestra como bloquear el contenido para que no se ejecute y sea enviado al cliente. Observar como todo lo que hay entre <% -- y -- %> se filtra y sólo es visible en el fichero que hay en el servidor, aunque incluya otras directivas ASP.NET.
<%--
<asp:calendar id="MyCal" runat=server/>
<% for (int i=0; i<45; i++) { %>
Hello World <br>
<% } %>
--%>
Los #Includes permiten a los desarrolladores insertar los contenidos de un fichero especificado en cualquier lugar de una página ASP.NET. El siguiente ejemplo nos demuestra como insertar una cabecera y un pie de página personalizados en una página.
<!-- #Include File="Header.inc"
-->
...
<!-- #Include File="Footer.inc" -->
ASP.NET 2.0 añade una nueva sintaxis declarativa para substituir los valores en una página antes de que sea analizada. Ésto es útil para substituir los valores de cadenas de conexión o configuraciones de una aplicación por los valores de las propiedades de controles de servidor, definidas en el fichero Web.config. También se puede usa para substituir valores de un fichero fuente de localización. Se puede encontrar más sobre cadenas de conexión, expresiones de recursos y manejadores de expresiones en las secciones Realizando Acceso a Datos, Internacionalizando Vuestra Aplicación y Extendiendo ASP.NET.
<asp:SqlDataSource ID="SqlDataSource1" ConnectionString='<%$ connectionStrings:Pubs %>' runat="server" SelectCommand="sp_GetAuthors" />
<asp:Label ID="Label1" Text='<%$
Resources: ExchRate, ConvertLabel %>' runat="server"/>