cliente ligero en.net tema 4 – asp.net dr. diego

126
Cliente Ligero en .NET Tema 4 – ASP.NET http:// paginaspersonales.deusto.es/dipina/MasterISW / Dr. Diego Lz. de Ipiña Gz. de Artaza http :// paginaspersonales.deusto.es / dipina (Personal) http :// www.morelab.deusto.es (Research Group) http :// www.smartlab.deusto.es (Research Lab) http://www.ctme.deusto.es (Cátedra de Telefónica Móviles) http://www.tecnologico.deusto.es (Tecnológico-Fundación Deusto)

Upload: perpetua-nery

Post on 23-Jan-2016

219 views

Category:

Documents


2 download

TRANSCRIPT

Page 1: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

Cliente Ligero en .NETTema 4 – ASP.NET

http://paginaspersonales.deusto.es/dipina/MasterISW/

Dr. Diego Lz. de Ipiña Gz. de Artazahttp://paginaspersonales.deusto.es/dipina (Personal)

http://www.morelab.deusto.es (Research Group)http://www.smartlab.deusto.es (Research Lab)

http://www.ctme.deusto.es (Cátedra de Telefónica Móviles)http://www.tecnologico.deusto.es (Tecnológico-Fundación Deusto)

Page 2: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

2/126

ASP.NET

Sucesor de Microsoft a la popular plataforma ASP para el desarrollo de aplicaciones web

Configuración: Atención: Si no funciona, re-registrar ASP.NET bajo

IIS: aspnet_regiis.exe -i

Page 3: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

3/126

Ejemplo HTML: simple.html

<html> <body> Hola mundo </body></html>

Page 4: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

4/126

Ejemplo Petición HTTP

GET /simple.html HTTP/1.1Accept: */*Accept-Language: en-usAccept-Encoding: gzip, deflateIf-Modified-Since: Wed, 24 Oct 2001 14:12:36 GMTIf-None-Match: "50b0d3ee955cc11:a78"User-Agent: Mozilla/4.0.(compatible; MSIE.6.0; Windows NT

5.1)Host: www.wintellect.comConnection: Keep-Alive[blank line]

Page 5: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

5/126

Ejemplo Respuesta HTTP

HTTP/1.1 200 OKServer: Microsoft-IIS/5.0Date: Wed, 24 Oct 2001 14:12:37 GMTContent-Type: text/htmlAccept-Ranges: bytesLast-Modified: Wed, 24 Oct 2001 14:00:53 GMTETag: "d02acf81975cc11:a78"Content-Length: 46[blank line]<html><body>Hola mundo</body></html>

Page 6: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

6/126

ASP.NET vs. ASP

Active Server Pages (ASP) ofrecen un simple modelo de programación en el que se puede combinar código fuente y de marcado Provee una serie de objetos prefabricados como Request y Response

El código fuente se suele realizar normalmente con VBScript, popular con programadores Visual Basic. Este código se coloca entre los delimitadores ‘<%’ y ‘%>’

Page 7: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

7/126

Ejemplo ASP<!-- hello.asp --><script language="VBScript" runat="server">function buildForm() firstName = Trim(Request.Form("firstName")) s = "" if firstName = "" then ' need a name... s = s & "What's Your First Name? " s = s & "<input type='text' name='firstName' />" s = s & "<input type='submit' />" else ' we know the user's name... s = s & "Hello, " & firstName & "!" end if buildForm = send function</script>

<html><head><title>Hello ASP App</title></head> <body> <h1>Hello ASP Application</h1> <form action='hello.asp' method='POST'> <%=buildForm()%> </form> </body></html>

Page 8: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

8/126

ASP.NET

Los ficheros ASP.NET tienen extensión aspx. El código en un ASP.NET es muy similar al de

ASP con las siguientes diferencias: La lógica de la página está codificada en C# o VB.NET.

El código es compilado cuando la petición de la página es recibida y se cachea para ser reutilizada

La directiva <%@Import Namespace=“...”%> permite importar espacios de nombres y utilizar el poder de la framework .NET

Page 9: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

9/126

Ejemplo ASP.NET

<!-- hello.aspx --><%@ Page Language="C#"%><%@ Import Namespace="System.Web.UI"%>

<script runat="server">private string buildForm() { string firstName = this.Request.Form["firstName"]; if (firstName == null) firstName = ""; string s = ""; if (firstName.Trim() == "") { // need a name... s += "What's Your First Name? "; s += "<input type='text' name='firstName' />"; s += "<input type='submit' />"; } else { // we know the user's name... s += "Hello, " + this.Request.Form["firstName"] + "!"; } return s;}</script>

<html><head><title>Hello ASP.NET App</title></head> <body> <h1>Hello ASP.NET Application</h1> <form action='hello.aspx' method='POST'> <%=buildForm()%> </form> </body></html>

Page 10: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

10/126

La clase System.Web.UI.Page

En el anterior listado encontramos la línea:string firstName = this.Request.Form[“firstName”]; El this en esta sentencia es una referencia a una instancia de System.Web.UI.Page, objeto que representa a una página ASP.NET

Los objetos Request y Response de ASP son ahora propiedades de la clase Page

El siguiente ejemplo muestra algunas de las propiedades de Request

Page 11: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

11/126

Usando Page.Request y Page.Response I<!-- dumpprops.aspx --><%@ Page Language="C#" Debug="true"%><script runat="server">private void dumpProps() { // get Request and Response objects... HttpRequest req = this.Request; HttpResponse resp = this.Response;

// and use them... resp.Write("Request.FilePath: " + req.FilePath + "<br/>"); resp.Write("Request.PhysicalApplicationPath: " + req.PhysicalApplicationPath + "<br/>"); resp.Write("Request.HttpMethod: " + req.HttpMethod + "<br/>"); resp.Write("Request.UserAgent: " + req.UserAgent + "<br/>"); resp.Write("Request.UserHostAddress: " + req.UserHostAddress + "<br/>");}</script>

<html><head><title>Dump Page Properties</title></head> <body> <h1>Page Properties</h1> <% dumpProps(); %> </body></html>

Page 12: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

12/126

Usando Page.Request y Page.Response II

Page 13: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

13/126

Recuperando Datos de Formularios con Request

Propiedades: RequestType:

Usando GET recuperaríamos los datos de QueryString Control=Valor&Control=Valor

Usando POST de la propiedad Form Request.Form["Direccion"]

La propiedad Params incluye además de los datos de un formulario, las cookies y las variables del servidor

Page 14: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

14/126

Formulario ASP.NET

Un elemento FORM en el que no aparece ni action ni method Estos atributos son substituidos por runat="server"

Indica que el motor ASP.NET debe procesar el contenido del formulario

Controles asp:TextBox, asp:Button y similares Los formularios ASP.NET facilitan el desarrollo de páginas

dinámicas Podemos acceder a los elementos del formulario directamente

(Nombre.Text), en vez de a través de QueryString o Params.

Page 15: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

15/126

Ciclo de Vida del Objeto Page

Cuando una petición HTTP es recibida ASP.NET responde creando y devolviendo una página Este proceso genera varios eventos La clase Page contiene varios métodos heredados de System.Web.UI.Control que se pueden utilizar para manejar estos eventos:

OnInit inicialización requerida por la página OnLoad ejecuta acciones comunes a cada petición HTTP de un

página OnPreRender para hacer cualquier cosa antes que la página se

visualice OnUnload sirve para realizar tareas como desconectarse de una

base de datos cuando la página se descarga

Page 16: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

16/126

Manejando Eventos de Página

<!-- pageevents.aspx --><%@ Page Language="C#" Debug="true" %><script runat="server">

protected override void OnInit(EventArgs e) { base.OnInit(e); p("Init"); }protected override void OnLoad(EventArgs e) { base.OnLoad(e); p("Load"); }protected override void OnPreRender(EventArgs e) {base.OnPreRender(e);

p("PreRender");}

private void p(string s) { Message.InnerHtml += s + "<br>";}

</script><html><head><title>Hello Web Page</title></head><body><h1>Page Events...</h1><form action='pageevents.aspx' method='POST'> <span id="Message" runat="server" /> <p> <input type="submit" /> </p></form></body></html>

Page 17: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

17/126

Creando un Directorio Virtual I

Creamos el directorio virtual ejemplosASP.NET:1. Hacemos doble click en Herramientas Administrativas

2. Doble click en Internet Information Services

Page 18: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

18/126

Creando un Directorio Virtual II

Creamos el directorio virtual ejemplosASP.NET:3. Hacemos clic con el botón derecho del ratón en

Default Web Site y luego seleccionamos NewVirtual Directory

4. Seleccionamos el directorio donde vamos a dejar los fichero accesibles por el contexto ‘ejemplosASP.NET’

Page 19: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

19/126

Web Forms y Server Controls

Un Web Form es un formulario con el atributo runat="server" que hace que se procese en la parte servidora

Un Server Control es un control que también tiene el atributo runat="server"

Tanto los web forms como los server controls son procesados en el servidor y generan HTML y JavaScript que son enviados al navegador

Page 20: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

20/126

Ejemplo Web Form I

<!-- helloform.aspx --><%@ Page Language="C#" Debug="true" %><script runat="server"> // greet the user...

private void greetHandler(object sender, EventArgs e) { firstNameTextBox.Text = firstNameTextBox.Text.Trim(); if (firstNameTextBox.Text == "") { // no name, so no greeting... greetingLabel.Text = ""; } else { // greet the user... greetingLabel.Text = "Hello, " + firstNameTextBox.Text + "!"; }

}</script>

Page 21: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

21/126

Ejemplo Web Form II

<html><head><title>Hello Web Form</title></head><body> <h1>Hello Web Form</h1> <form action='helloform.aspx' method='POST' runat='server'> <asp:label text="What's Your First Name?"

runat="server"/> <asp:textbox id="firstNameTextBox" runat="server"/> <asp:button id="greetButton" text="Greet" OnClick="greetHandler" runat="server"/> <p><asp:label id="greetingLabel" runat="server"/></p> </form></body></html>

Page 22: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

22/126

Ejemplo Web Form III

Puntos de interés: Declaración del formulario mediante <form … runat="server"/>

En vez de usar HTML usamos etiquetas asp como: <asp:control-type … runat="server"/>

Estas etiquetas corresponden a los controles de la parte servidora

Se transforman en HTML por ASP.NET

Page 23: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

23/126

Ejemplo Web Form IV

Page 24: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

24/126

Ejemplo Web Form V

Los controles del servidor preservan su valor a través de peticiones HTTP Lo hacen guardando las propiedades en un variable de nombre __VIEWSTATE

El valor de __VIEWSTATE es una cadena de caracteres codificada en base-64. Los controles generan eventos que pueden ser tratados por handlers. Por

ejemplo:<asp:button id=“greetButton” text=“Greet” OnClick=“greetHandler” runat=“server”/> El manejador de eventos tiene una firma similar al equivalente en Windows Forms:

private void greetHandler(object sender, EventArgs e) { …}

Podemos sobrescribir el método OnLoad y también usar el enfoque delegate:protected override void OnLoad(EventArgs e) {

base.OnLoad(e);// uso del delegate …greetButton.Click += new EventHandler(greetHandler);

}

Page 25: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

25/126

Codificación Base 64

Subconjunto de 64 caracteres ASCII que permiten a grupos de 6 bits ser representados por un carácter

El proceso de codificación representa grupos de 24 bits de entrada (3 bytes de entrada) como un string de salida con 4 bytes de salida (2^6)

Referencia: http://en.wikipedia.org/wiki/Base64

Page 26: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

26/126

System.Web.UI.WebControls y System.Web.UI.HtmlControls

El espacio de nombres System.Web.UI.WebControls define un montón de controles, entre ellos: Button Calendar CheckBoxList DataGrid DataList DropDownList Label Panel Etc.

En System.UI.HtmlControls se definen una serie de controles como HtmlAnchor y HtmlTable que definen una correspondencia uno-a-uno con la etiqueta HTML equivalente, p.e., HtmlAnchor y HtmlTable

Page 27: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

27/126

System.Web.UI.WebControls y System.Web.UI.HtmlControls

Al insertar usando el Toolbox de Visual Studio.NET controles HTML obtenemos: <input type=“text”/> <input type=“checkbox”/> <input type=“button” value=“Button”/>

Al insertar web controls obtenemos: <asp:TextBox id=“TextBox1” runat=“server”> </asp:TextBox> <asp:CheckBox id=“CheckBox1” runat=“server”> </asp:CheckBox> <asp:Button id=“Button1” runat=“server”> </asp:Button>

Page 28: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

28/126

Propiedades Interesantes de los WebControls

Estilo Visual Height y Width Backcolor y ForeColor BorderColor, BorderStyle y BorderWidth

Propiedades de comportamiento Enabled Visible AccessKey TabIndex ReadOnly

Generación de Eventos AutoPostBack

Indica si el control ha de producir automáticamente una nueva solicitud al servidor

Page 29: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

29/126

Mantenimiento de Estado en Controles

La propiedad EnableViewState determina si un control ASP.NET debe mantener su estado entre solicitudes Su valor por defecto es True

El campo oculto __VIEWSTATE es el mecanismo utilizado por ASP.NET para conservar estado

Page 30: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

30/126

Usando el Control Calendar

<!-- calendarform.aspx.aspx --><%@ Page Language="C#" Debug="true" %><script runat=server>

private void dateHandler(object sender, EventArgs e) { myMessage.Text = "You selected " + myCalendar.SelectedDate.ToShortDateString(); }</script><html><head><title>Calendar ASP.NET App</title></head> <body> <h1>Calendar ASP.NET Application</h1> <form runat="server"> <asp:calendar id="myCalendar" onSelectionChanged="dateHandler" Font-Name="Verdana" Font-Size="8pt" Font-Bold="true" BorderColor="black" BackColor="Gainsboro" runat="server" /> <p> <asp:Label id="myMessage" Font-Name="Verdana" Font-Size="8pt" Font-Bold="true" runat="server" /> </p> </form> </body></html>

Page 31: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

31/126

Usando el Control Calendar

Page 32: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

32/126

Usando el Control DataGrid I

<!-- dataformexample.aspx --><%@ Page Language="C#" %><%@ Import Namespace="System.Data" %><%@ Import Namespace="System.Data.SqlClient" %><script runat="server">protected override void OnLoad(EventArgs e) {

base.OnLoad(e);

SqlConnection con = new SqlConnection("server=<server-name>;database=pubs;uid=sa;pwd=<password>");

SqlDataAdapter com = new SqlDataAdapter("select * from titles", con);

DataSet ds = new DataSet(); com.Fill(ds, "titles");

titlesGrid.DataSource=ds.Tables["titles"].DefaultView; titlesGrid.DataBind();}</script>

Page 33: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

33/126

Usando el Control DataGrid II

<html><head><title>DataGrid ASP.NET App</title></head> <body> <h1>DataGrid ASP.NET Application</h1> <form runat="server"> <asp:dataGrid id="titlesGrid" BackColor="Gainsboro" BorderColor="black" CellPadding="10" CellSpacing="0" Font-Name="Verdana" Font-Size="8pt" Font-Bold="true" HeaderStyle-BackColor="lightGreen" EnableViewState="false" runat="server" /> </form> </body></html>

Page 34: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

34/126

Usando el Control DataGrid III

<asp:dataGrid …/> visualiza el DataGrid en el formulario

Para cargar datos en el grid, usamos su propiedad DataSource y le asociamos datos invocando a DataBind()

DataGrid soporta paginamiento: PageSize indica el número de filas a visualizar por página AllowPaging sirve para visualizar botones Previous and Next

en la página

Page 35: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

35/126

Usando el Control DataGrid III

Page 36: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

36/126

Usando DataGrid IV

Una pregunta frecuente suele ser cómo añadir un hiperlink a una de las celdas de un DataGrid: http://msdn.microsoft.com/library/default.asp?url=/librar

y/en-us/vbcon/html/vbtskaddinghyperlinkcolumnstodatagridwebcontrol.asp

Page 37: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

37/126

Usando DataGrid V<%@ Page language="c#" Codebehind="WebForm1.aspx.cs" AutoEventWireup="false"

Inherits="DataGridWithHyperlink.WebForm1" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" ><HTML> <HEAD> <title >WebForm1</title> <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR"> <meta content="C#" name="CODE_LANGUAGE"> <meta content="JavaScript" name="vs_defaultClientScript"> <meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema"> </HEAD> <body MS_POSITIONING="GridLayout"> <form id="Form1" method="post" runat="server"> <asp:DataGrid id="DataGrid1" style="Z-INDEX: 101; LEFT: 192px; POSITION: absolute; TOP:

104px“ runat="server" DataSource="<%# TitlesDataSet %>" AutoGenerateColumns="False"> <Columns>

<asp:HyperLinkColumn DataTextField="title_id" HeaderText="title_id" NavigateUrl="http://paginaspersonales.deusto.es/dipina"></asp:HyperLinkColumn>

<asp:BoundColumn DataField="title" SortExpression="title" HeaderText="title"></asp:BoundColumn> <asp:BoundColumn DataField="type" SortExpression="type" HeaderText="type"></asp:BoundColumn> <asp:BoundColumn DataField="pub_id" SortExpression="pub_id" HeaderText="pub_id"></asp:BoundColumn> </Columns> </asp:DataGrid>

</form> </body></HTML>

Page 38: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

38/126

Usando el control HtmlTable I<!-- tableform.aspx --><%@ Page Language="C#" Debug="true" %><%@ Import Namespace="System"%><%@ Import Namespace="System.Web.UI"%><script runat="server">protected override void OnLoad(EventArgs e) { base.OnLoad(e); int cellNum = 0; if (IsPostBack) { // falso cuando el formulario se crea por primera vez try { cellNum = Int32.Parse(cellTextBox.Text); } catch (Exception) { cellNum = 0; // don't highlight any cell } } int rows = 3, cols = 3, num = 0; for (int i = 0; i < rows; i++) { HtmlTableRow htmlRow = new HtmlTableRow(); for (int j = 0; j < cols; j++) { num++; HtmlTableCell htmlCell = new HtmlTableCell(); htmlCell.Controls.Add(new LiteralControl(num.ToString())); if (num == cellNum) htmlCell.BgColor="Yellow"; htmlRow.Cells.Add(htmlCell); } myTable.Rows.Add(htmlRow); }}</script>

Page 39: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

39/126

Usando el control HtmlTable II

<html><head><title>HtmlTable Example</title></head><body> <h1>HtmlTable Example</h1> <form runat="server"> <table id="myTable" border="1" cellPadding="10" cellSpacing="1" runat="server" /> <p> Cell# <asp:textbox id="cellTextBox" columns="1" maxLength="1" runat="server"/> <br> <input type="submit" value="Highlight Cell" runat="server"> </p> </form></body></html>

Page 40: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

40/126

Usando el control HtmlTable I

La propiedad de una página IsPostBack es falsa cuando un formulario se carga por primera vez

Obsérvese cómo programáticamente podemos ir creando la tabla: HtmlTable HtmlRow HtmlCell

Page 41: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

41/126

Controles de Usuario

Podemos crear tres tipos de controles: Pagelets

Fragmentos de código HTML que pueden reutilizarse como si de componentes se tratara

Controles simples Derivados de System.Web.UI.Control

Controles compuestos Reutilizan uno o más controles ya existentes Los especializan

Page 42: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

42/126

Creación de Pagelets

Es un conjunto de marcas HTML alojadas en un archivo independiente y que se pueden reutilizar Podemos personalizar ese contenido a través de propiedades

Se alojan en ficheros con extensión .ascx Contienen marcado:

<br/><p>Distributed.NET</p>

Tendremos que registrar este fragmento, le damos un nombre y le asociamos un prefijo, en todos los .aspx donde queramos utilizar este control<%@ Register TagPrefix="DN" TagName=“Firma“ Src=“Firma.ascx" %>

Page 43: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

43/126

Creación de Pagelets

<%@ Register TagPrefix="DN" TagName= "Firma" Src= "Firma.ascx“ %>

Si en lugar de tener un archivo .ascx, tuviéramos un control alojado en un ensamblado, substituiríamos src por Assembly

Después podríamos incluir el pagelet en cualquier otra página utilizando:<DN:Firma id="Firma1" runat="server" ></DN:Firma>

runat="server" lo identifica como control del servidor, ASP.NET lo substituirá por el código asociado

Page 44: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

44/126

Pagelets con propiedades

¿Cómo personalizar un pagelet? Tan sencillo como declarar variables públicas

Ejemplo:<script language="C#" runat="server"> public string BackgroundColor="white"; public int BorderWidth = 1; public string Text="Distributed.NET";</script><div style="clear; left; background-color: <

%=BackgroundColor%>; border: solid <%=BorderWidth%>px">

<p style="text-align: center"><%=Text%></p></div>

Page 45: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

45/126

Pagelets con propiedades

A continuación incluiríamos el siguiente fragmento en el .aspx donde incluir esta cabecera<%@ Register TagPrefix="DN" TagName= "Cabecera" Src= "Cabecera.ascx" %>

Y en el código del .aspx podríamos crear entradas como:<DN:Cabecera id="Pie" runat="server" BorderWidth="3"

Text="Pie de página"></DN:Cabecera> Revisar ejemplo en examples\asp.net\SecurityExample

Page 46: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

46/126

Creando Controles Web de Usuario con Pagelets

Permite encapsular dos o más elementos de interfaz en un control reusable Podemos incluso reutilizar formularios web en controles de

usuario Podemos ensamblar formularios agrupando componentes

personalizados reutilizables Pasos conversión web form -> user control:

Guardar el formulario con extensión .ascx Eliminar todas las sentencias <html>, <head>, <title>, <body> o <form>

Page 47: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

47/126

Usercolor.ascx I

<!-- usercolor.ascx -->

<script language="C#" runat="server">

public string Color { get { if (colorTextBox.Text == "") return "white"; return colorTextBox.Text; } }

public bool Visible { get { return colorPanel.Visible; } set { colorPanel.Visible = value; } }</script>

Page 48: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

48/126

Usercolor.ascx II

<asp:panel id="colorPanel" visible="false" runat="server"> <asp:label Font-Name="Verdana" Font-Size="7pt" text="Color : " runat="server"/> <asp:textbox Font-Name="Verdana" Font-Size="7pt" columns="10" id="colorTextBox" runat="server"/></asp:panel>

Page 49: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

49/126

Usercolor.ascx III

Este control está compuesto de una label y una textbox, contenidas dentro de un Panel.

Definimos dos propiedades públicas para el control: Color y Visible.

Para localizar el control en un formulario debemos incluir:<%@ Page Language="C#" Debug="true" %><%@ Register TagPrefix="userColors" TagName="userColor" Src="usercolor.ascx" %>

Para usar el control hacemos:<userColors:userColor id="userColorControl" runat="server"/>

Page 50: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

50/126

Colorform.aspx I<%@ Page Language="C#" Debug="true" %><%@ Register TagPrefix="userColors" TagName="userColor" Src="usercolor.ascx" %><script runat="server"> protected override void OnLoad(EventArgs e) { base.OnLoad(e); body.Attributes["bgcolor"] = userColorControl.Color; userColorControl.Visible = !userColorControl.Visible; }</script><html><head><title>The UserColor Control</title></head> <body id="body" runat="server"> <h1>The UserColor Control</h1> <form runat='server'> <userColors:userColor id="userColorControl" runat="server"/> <p> This form uses the UserColor user control. When you submit the form the selected color will be used to set the page's background color. </p> <asp:button text="Submit" Font-Name="Verdana" Font-Size="7pt" BorderColor="black" type="submit" runat="server"/> </form> </body></html>

Page 51: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

51/126

Colorform.aspx II

Page 52: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

52/126

Custom Controls

Se diferencian de los controles de usuario en que su código se aloja ya compilado en un ensamblado de tipo DLL

Usamos la opción de proyecto Web Control Library de Visual Studio.NET para crear un WebControlLibrary1

A continuación añadimos el proyecto WebApplicationUsingCustomControl

Podemos utilizar la paleta de controles para añadir el custom control creado

Lo mejor es heredar nuestros controles de clases que derivan de System.Web.UI.Control como System.Web.UI.WebControls.WebControl

Page 53: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

53/126

Custom Control Cabecera de nuevo

Podemos o bien reimplementar el método Render() de WebControl que renderiza el contenido de un control

O mejor redefinir los métodos: AddAttributesToRender() agrega nuevos

contenidos y atributos RenderContents() invoca a la implementación

base de Render

Page 54: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

54/126

Creando un Control Compuesto con Código

No genera su interfaz, se basa en otros controles ya existentes

Los controles se añaden al control de usuario en el método CreateChildControls()

Page 55: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

55/126

Creando un Control Compuesto con Código

public class WebCustomControl1 : Control, INamingContainer{ private TextBox euros, pesetas; protected override void CreateChildControls() { this.euros = new TextBox(); this.pesetas = new TextBox(); euros.Text = "0"; euros.AutoPostBack = true; euros.TextChanged += new EventHandler(Euros_TextChanged);

pesetas.Text = "0"; pesetas.AutoPostBack = true; pesetas.TextChanged += new EventHandler(Pesetas_TextChanged);

this.Controls.Add(this.euros); this.Controls.Add(new LiteralControl("€<br/>")); this.Controls.Add(this.pesetas); this.Controls.Add(new LiteralControl("Pts")); }

private void Euros_TextChanged(object sender, EventArgs e) { pesetas.Text = (Math.Round(Convert.ToDouble(euros.Text) * 166.386)).ToString(); }

private void Pesetas_TextChanged(object sender, EventArgs e) { euros.Text = (Math.Round(Convert.ToDouble(pesetas.Text) / 166.386)).ToString(); }}

Page 56: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

56/126

Validando la Entrada de Datos

La plataforma Web Forms provee una selección de controles de validación que sirven para: Validar la entrada de datos Mostrar mensajes de error al usuario

Todos los controles de validación agregados a una página ASP.NET pasan a formar parte de la colección Validators, que es de sólo lectura ValidatorCollection es el tipo de la colección Los validadores derivan todos de BaseValidator

Para poner en marcha la validación se invoca el método Validate() de Page De manera directa A través de los controles con la propiedad CausesValidation

Page 57: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

57/126

Validando la Entrada de Datos

Los controles de validación proporcionados son: RequiredFieldValidator CompareValidator compara una entrada con un valor o la

propiedad de otro control RangeValidator entrada en un rango de valores RegularExpressionValidator requiere que una entrada se

corresponda con una expresión regular CustomValidator validación propietaria codificada por usuario ValidationSummary muestra un resumen de errores de validación

para todos los controles de validación en una página

Page 58: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

58/126

Validando la Edad I<!-- ageform.aspx --><%@ Page Language="C#" Debug="true" %>

<script runat="server"> private void ageHandler(object sender, EventArgs e) { if (IsValid) ageLabel.Text = "You are " + ageTextBox.Text + " years old."; else ageLabel.Text = "Please Enter Your Age."; }</script>

<html><head><title>Validating a User's Age</title></head><body> <form runat='server'>

<h1>Validating a User's Age</h1> <asp:label text="Age : " runat="server"/> <asp:textbox id="ageTextBox" columns="3" maxLength = "3" runat="server"/> <asp:button id="submitButton" text="Submit" onClick="ageHandler" runat="server"/> <p> <asp:label id="ageLabel" text="Please Enter Your Age." runat="server"/> </p>

Page 59: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

59/126

Validando la Edad II

<!-- require an entry... --> <asp:requiredFieldValidator controlToValidate="ageTextBox" errorMessage="Age required" enableClientScript="true" display="static" runat=server /><br/> <!-- must be an integer... --> <asp:regularExpressionValidator controlToValidate="ageTextBox" errorMessage="Age must be an integer" enableClientScript="true" display="static" validationExpression="^\d{1,3}$" runat="server" /><br/> <!-- must be aged between 1 and 120 years... --> <asp:rangeValidator controlToValidate="ageTextBox" errorMessage="Age must be between 1 and 120 years" enableClientScript="true" display="static" type="Integer" minimumValue="1" maximumValue="120" runat="server" /> <hr/> </form></body></html>

Page 60: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

60/126

Validando la Edad III

Los controles utilizados tienen las siguientes propiedades en común: controlToValidate especifica el control a validar

(ageTextBox) errorMessage el texto de error a visualizar enableClientScript genera JavaScript si el cliente lo

permite display los controles de validación son invisibles por defecto, static crea espacio para visualizar el error

Si cualquier validación es falsa asigna el valor false a IsValid.

Page 61: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

61/126

Validaciones Complejas

Mediante RegularExpressionValidator y CustomValidator

RegularExpressionValidator tiene la propiedad ValidationExpression donde colocaremos una expresión regular

Podemos crear nuestra propia función de validación con CustomValidator Habrá que codificarla en JavaScript y añadirla como un elemento

script de HTML Propiedad esencial ClientValidationFunction

Page 62: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

62/126

Validaciones Complejas

<script>//Función de validación a medidafunction VerificaMeses(source, arguments){ if (arguments.Value >= 6 && arguments.Value <=24 && arguments.Value%6 == 0) arguments.IsValid = true; else arguments.IsValid = false;}

Page 63: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

63/126

Configurando y Customizando las aplicaciones ASP.NET I

ASP.NET provee un sistema de configuración jerárquico que permite a un administrador definir datos de configuración en los siguientes niveles a través del fichero Web.config: Aplicación Sitio Nivel de máquina

Dentro de ASP.NET se pueden especificar ficheros de configuración en subdirectorios

El sistema de configuración de ASP.NET es parte de la infraestructura de configuración global de .NET. Para configurar: http://server/app/dir/page.aspx, se aplican las configuraciones en el siguiente orden: C:\WINNT\Microsoft.NET\Framework\<versión>\CONFIG\machine.config

para la máquina C:\Inetpub\wwwroot\web.config para el sitio C:\app\web.config configuraciones específicas de la aplicación C:\app\dir\web.config configuraciones específicas del subdirectorio

Page 64: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

64/126

Configurando y Customizando las aplicaciones ASP.NET II

Las siguientes configuraciones son posibles: Instalación de manejadores de HTTP ISAPI Implementar seguridad y login Especificar timeout de sesión Soportar LOCALEs alternativos Configurar el debugeo de aplicaciones

Page 65: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

65/126

Creando un Módulo HTTP Propietario I

Antes de que una petición sea procesada por un ASP.NET es posible “pre-procesarla” por medio de un módulo HTTP

Para crear un módulo HTTP propietario lo siguiente es necesario: Crear una clase que implemente los métodos definidos por la interfaz IHttpModule, compilarla

y dejarla en el directorio bin de la aplicación web: Init: recibe como argumento un HttpApplication que define los siguientes eventos:

BeginRequest AcquireRequestState EndRequest

Dispose: se puede eliminar información aquí Para instalarlo hay que añadir una entrada a la sección httpmodules al web.config:

<configuration> <system.web> <httpModules> <add name="Request Counter Module"

type="CustHttpModules.RequestCounterModule, custhttpmodules"/> </httpModules>

</system.web></configuration>

Page 66: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

66/126

Creando un Módulo HTTP Propietario II

// file : custhttpmodules.cs// compile : csc /t:library custhttpmodules.csusing System;using System.Web;using System.Web.SessionState;namespace CustHttpModules { public class RequestCounterModule : IHttpModule { public void Init(HttpApplication ha) { ha.AcquireRequestState += new EventHandler(gotState); } public void Dispose() { // perform any necessary cleanup here } private void gotState(object sender, EventArgs e) { HttpApplication ha = (HttpApplication)sender; HttpSessionState s = ha.Session;

if (s["numRequests"] == null) { s["numRequests"] = 1; } else { int numRequests = (int)s["numRequests"]; s["numRequests"] = ++numRequests; } } }}

Page 67: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

67/126

Creando un Módulo HTTP Propietario III<!-- dumpreqs.aspx --><%@ Page Language="C#" Debug="true"%><script runat="server"> private void dumpReqs() { string s = "Number of Requests: " + Session["numRequests"]; Response.Write(s); }</script>

<html><head><title>HTTP Request Count</title></head> <body> <h1>HTTP Request Count</h1> <% dumpReqs(); %> </body></html>

Page 68: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

68/126

Creando un Módulo HTTP Propietario IV

Page 69: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

69/126

Creando un Manejador HTTP I

A diferencia de un módulo HTTP, un HTTP handler está diseñado para procesar la petición completamente, y devolver un resultado al navegador

Información extra sobre HTTP Modules y Handlers puede encontrarse en: http://support.microsoft.com/default.aspx?scid=kb;EN-US;307985#2

Necesario crear una clase que implementa la interfaz IHttpHander Para instalar el HttpHandler usar las siguientes sentencias en el web.config:

<configuration> <system.web> <httpHandlers> <add verb="*" path="hellohandler.aspx"

type="CustomHttpHandlers.HelloHandler, custhttphandlers" /> </httpHandlers> </system.web></configuration>

Page 70: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

70/126

Creando un Manejador HTTP II

// file : custhttphandlers.cs// compile : csc /t:library custhttphandlers.csusing System.Web;namespace CustomHttpHandlers { public class HelloHandler : IHttpHandler {

public void ProcessRequest(HttpContext hc) { hc.Response.Write("Hello, World!"); }

public bool IsReusable { get { return true; } } }}

Page 71: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

71/126

Creando un Manejador HTTP III

Page 72: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

72/126

Haciendo Debugging de Aplicaciones ASP.NET

Para encontrar problemas en el código de un ASP.NET, éste ofrece dos niveles de testeo: Page-level tracing

Utiliza la siguiente directiva: <%@ Page Language=“C#” Trace=“true”%>

Para insertar tus propios fragmentos de trace usar las sentencias: Trace.Write y Trace.Warn

Application-level tracing, modificando web.config

Page 73: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

73/126

Tracing a Nivel de Página I

<!-- traceform.aspx --><%@ Page Language="C#" Trace="True" %><script runat="server"> // greet the user... private void greetHandler(object sender, EventArgs e) {

Trace.Warn("*** Entering greetHandler ***");

firstNameTextBox.Text = firstNameTextBox.Text.Trim();

Trace.Warn("*** First Name = '" + firstNameTextBox.Text + "' ***");

if (firstNameTextBox.Text == "") { // no name, so no greeting... greetingLabel.Text = ""; Trace.Warn("*** No greeting ***"); } else { // greet the user... greetingLabel.Text = "Hello, " + firstNameTextBox.Text + "!"; } Trace.Warn("*** Greeting = '" + greetingLabel.Text + "' ***"); }</script>

Page 74: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

74/126

Tracing a Nivel de Página II

<html><head><title>Hello Web Form</title></head><body> <h1>Hello Web Form</h1> <form action='helloform.aspx' method='POST' runat='server'> <asp:label text="What's Your First Name?"

runat="server"/> <asp:textbox id="firstNameTextBox" runat="server"/> <asp:button id="greetButton" text="Greet" OnClick="greetHandler" runat="server"/> <p><asp:label id="greetingLabel" runat="server"/></p> </form></body></html>

Page 75: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

75/126

Tracing a Nivel de Página III

Page 76: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

76/126

Tracing a Nivel de Aplicación I

<configuration> <system.web> <trace enabled="true" localOnly="true“ pageOutput="false“ requestLimit="10“ traceMode="SortByTime"/>

</system.web></configuration> enabled para activar/desactivar el tracing localOnly hacer tracing sólo en localhost pageOutput true si se pone la información de debugging al final de cada página, o en

false en el fichero trace.axd requestLimit cuántos traces de peticiones a guardar traceMode si se ordenan por tiempo (SortByTime) o categoría (SortByCategory)

Page 77: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

77/126

Objetos principales de una aplicación ASP.NET

Response (HttpResponse) Write() WriteFile() BinaryWrite() Redirect()

Request (HttpRequest) Request y Response tienen la propiedad Cookies que es una colección QueryString ServerVariables Files ficheros enviados desde el cliente (file uploads) BinaryRead() SaveAs()

Application (HttpApplicationState) Session (HttpSession)

Page 78: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

78/126

Estado de Aplicación en Global.Asax

Los objetos de aplicación son compartidos por todas las sesiones y viven la duración completa de una aplicación Se crean e inicializan en el fichero global.asax

La principal ventaja de los objetos a nivel de aplicación es que una vez que ocurre la primera petición, todas las aplicaciones tienen acceso al objeto

Como puede haber acceso concurrente a los datos, si hay necesidad de cambiarlos hay que usar Locks:Application.Lock();Application[“someVar”] = someVal;Application.UnLock();

Page 79: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

79/126

Global.Asax

<%@ Import Namespace="System.Data" %><%@ Import Namespace="System.Data.SqlClient" %>

<script language="C#" runat="server">

// global.asax methods...

private void Application_Start(object sender, EventArgs e) {

SqlConnection con =new SqlConnection("server=<server-name>;database=pubs;uid=sa;pwd=<password>");

string sql; SqlDataAdapter com; DataSet ds = new DataSet();

sql = "SELECT COUNT(*) from titles"; com = new SqlDataAdapter(sql, con); com.Fill(ds, "NumTitles"); Application["NumTitles"] = ds.Tables["NumTitles"].Rows[0][0];}</script>

Page 80: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

80/126

dumpTitles.aspx I

<!-- dumptitles.aspx --><%@ Page Language="C#" Debug="true"%>

<script runat="server"> private void dumpTitles() { string s = "Num Titles: " + Application["NumTitles"] + "<br/>"; Response.Write(s); }</script>

<html><head><title>Application State</title></head> <body> <h1>Application State</h1> <% dumpTitles(); %> </body></html>

Page 81: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

81/126

dumpTitles.aspx II

Page 82: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

82/126

Gestionando la Sesión I

Session es una propiedad pública de System.Web.UI.Page y System.Web.Services.WebService

Guardamos y recuperamos estado de sesión como sigue:int numRequests = (int)Session[“numRequests”];...Session[“numRequests”] = ++numRequests;

Una sesión comienza cuando un usuario visita la aplicación y acaba cuando la sesión expira

Page 83: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

83/126

Gestionando la Sesión II

<configuration> <system.web> <sessionState mode=“InProc” cookieless=“true” timeout=“20” stateConnectionString=“…” sqlConnectionString=“…”/> </system.web> </configuration> El significado de estos atributos es el siguiente:

mode Off para no permitir sesiones, InProc para guardar la información de sesión en el mismo proceso, StateServer remotamente o SqlServer en una BD

cookieless true para sesiones sin cookies, añadiría identificador de usuario a URL

timeout minutos que una sesión estará inactiva hasta que es abandonada stateConnectionString por ejemplo: 127.0.0.1:42424 sqlConnectionString el string de conexión de SQL Server

Page 84: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

84/126

Ejemplo Redirect y Session

Login.aspx:void Page Load(object sender, EventArgs e) { if (IsPostBack) { Session[“Nombre”] = Nombre.Text; Session[“Dirección”] = Direccion.Text; Response.Redirect(“Confirmation.aspx”); }}

Confirmation.aspxvoid Page Load(object sender, EventArgs e) { Response.Write(“Activar subscripción ” +

Session[“Nombre”]);}

Page 85: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

85/126

Vamos a crear una aplicación web que codifica strings a Base64

Lanza Visual Studio.NET y selecciona File|New|Project … Visual C# Projects ASP.NET Web Application Llama a la aplicación BAse64App

Automáticamente se crea un Directorio Virtual y se colocarán los ficheros en c:\InetPub\wwwroot\Base64App

Usando Visual Studio 2005

Page 86: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

86/126

Visual Studio.NET separa el formulario web y el código detrás del formulario

Lo hace a través del atributo CodeBehind:<%@ Page language="c#" Codebehind="WebForm1.aspx.cs"

AutoEventWireup="false" Inherits="Base64App.WebForm1" %>

Usamos la ToolBox para generar un formulario como el que aparece en la siguiente figura

Crea un fichero de configuración especial denominado Web.config

Usando Visual Studio 2005

Page 87: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

87/126

Usando Visual Studio.NET III

Page 88: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

88/126

Usando Visual Studio.NET IV

private void EncodeButton_Click(object sender, System.EventArgs e){ if (base64TextBox.Text == "") { this.EncodedLabel.Text = ""; } else { System.Text.ASCIIEncoding ascii = new System.Text.ASCIIEncoding(); byte[] b = ascii.GetBytes((string)base64TextBox.Text); this.EncodedLabel.Text = "ENCODED: " + Convert.ToBase64String(b); }}

private void DecodeButton_Click(object sender, System.EventArgs e){ if (base64TextBox.Text == "") { this.DecodedLabel.Text = ""; } else { byte[] b = Convert.FromBase64String(base64TextBox.Text); System.Text.ASCIIEncoding ascii = new System.Text.ASCIIEncoding(); this.DecodedLabel.Text = "DECODED: " + ascii.GetString(b); }}

Page 89: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

89/126

Usando Visual Studio.NET V

Page 90: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

90/126

Creando Manualmente Formularios con Code Behind I

<!-- behindform.aspx --><%@ Page Language="C#" Inherits="BehindForm" Src="behindform.cs" %>

<html><head><title>Hello Web Form</title></head>

<body> <h1>Hello Web Form (Code-Behind Version)</h1> <form action='behindform.aspx' method='POST' runat='server'>

<asp:label text="What's Your First Name?" runat="server"/> <asp:textbox id="firstNameTextBox" runat="server"/> <asp:button id="greetButton" text="Greet" OnClick="greetHandler" runat="server"/> <p> <asp:label id="greetingLabel" runat="server"/> </p>

</form></body></html>

Page 91: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

91/126

Creando Manualmente Formularios con Code Behind II

// file : behindform.csusing System;using System.Web.UI;using System.Web.UI.WebControls;

public class BehindForm : Page {

protected TextBox firstNameTextBox; protected Label greetingLabel;

// greet the user... protected void greetHandler(object sender, EventArgs e) {

firstNameTextBox.Text = firstNameTextBox.Text.Trim(); if (firstNameTextBox.Text == "") { // no name, so no greeting... greetingLabel.Text = ""; } else { // greet the user... greetingLabel.Text = "Hello, " + firstNameTextBox.Text + "!"; } }}

Page 92: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

92/126

Creando Manualmente Formularios con Code Behind III

Page 93: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

93/126

Creando gráficos “on-the-fly”

<%@ Page Language="C#" %><%@ Import Namespace="System.Drawing" %><%@ Import Namespace="System.Drawing.Imaging" %><script runat="server">

void Page_Load(object sender, EventArgs e) {

// Creamos el bitmap y obtenemos el objeto Graphics asociadoBitmap Grafico = new Bitmap(400, 200, PixelFormat.Format32bppRgb);Graphics Superficie = Graphics.FromImage(Grafico);

// Dibujamos un rectángulo, un óvalo y un texto sobre élSuperficie.FillRectangle(Brushes.Red, Superficie.ClipBounds);Superficie.FillEllipse(Brushes.Blue, 10, 10, 380, 180);Superficie.DrawString("Distributed.NET", new Font("Courier New", 18,

FontStyle.Italic|FontStyle.Bold), Brushes.White, 20, 80);

// Lo pasamos como respuestaGrafico.Save(Response.OutputStream, ImageFormat.Jpeg);

}</script>

Page 94: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

94/126

Creando gráficos “on-the-fly”

Page 95: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

95/126

Ejemplo ASP.NET con ADO.NET(Access)

// examples\ADOAccessASPXpublic class WebForm1 : System.Web.UI.Page{ private void Page_Load(object sender, System.EventArgs e) { OleDbConnection conexion = new

OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;"+"Data Source=F:\\Deusto\\Distributed.NET\\examples\\ado.net\\pubs.mdb");

OleDbCommand comando = new OleDbCommand("SELECT * FROM TITLES", conexion);

OleDbDataAdapter adaptador = new OleDbDataAdapter(comando); DataSet conjunto = new DataSet(); adaptador.Fill(conjunto, "Publicaciones"); Response.Write("Hay " + conjunto.Tables["Publicaciones"].Rows.Count + "

filas<br/>"); foreach (DataRow fila in conjunto.Tables["Publicaciones"].Rows) { Response.Write(fila["title_id"] + " - " + fila["title"] + "<br/>"); } }}

Page 96: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

96/126

Componentes ASP específicos de Datos

Cualquier control puede tomar valores de un BBDD mediante la expresión:<asp:control propiedad='<%# expresion %>'><asp:control>

Otros controles más sofisticados tienen la propiedad DataBindings Vamos a extender el ejemplo anterior para rellenar una Label con

valores de una BBDD Es necesario invocar al método DataBind() de Page Colocar un Label con la ayuda de Visual Studio.NET y asociar a la

propiedad DataBindings, la expresión: Conjunto.Tables["Publicaciones"].Rows[0].["Titulo"]

Page 97: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

97/126

Listas, cuadrículas y plantillas

Vamos a ver como asociar fuentes de datos a controles con capacidad para visualizar múltiples filas:

ListBox DropDownList CheckBoxList DataGrid Repeater DataList

A través de las propiedades DataSource y DataMember podemos asociar una tabla o vista

ListBox, DropDownList y CheckBoxList asocian los valores de una misma columna en distintas filas

Tienen las propiedades DataTextField y DataValueField Repeater y DataList se basan en la repetición de plantillas de elementos

<ItemTemplate><%# DataBinder.Eval(Container.DataItem, "Title") %></ItemTemplate>

Page 98: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

98/126

Paginación

Los controles Repeater y DataList no ofrecen paginación de serie Se debe implementar bien manualmente o a través del

componente PagedDataSource El control DataGrid se apoya en PagedDataSource

para automatizar la paginación Dando True a AllowPaging activamos la paginación Debemos gestionar el evento PageIndexChanged, donde

asociaremos el DataGrid al origen de datos

Page 99: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

99/126

Seguridad en ASP.NET

Intervienen 3 níveles: La comunicación entre un navegador y el motor ASP.NET se

produce a través de un servidor web, IIS El primer nivel de seguridad radica en el filtrado de peticiones que se

puede efectuar por el IIS El segundo escalón de seguridad es el impuesto por ASP.NET

La información de seguridad global y local se guarda en los ficheros Web.config

El tercer nivel de seguridad viene dado por NTFS

Page 100: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

100/126

Configuración de IIS

Con la ayuda del inetmgr podemos configurar: Un sitio web completo Carpeta virtual asociada a una aplicación Una de sus subcarpetas Archivo individual

Normalmente tendremos marcada la opción “Acceso anónimo” Si queremos identificar individualmente a un usuario usaríamos

desactivaríamos el acceso anónimo Tendríamos “Autenticación de Windows Integrada” adecuada para intranets Podríamos seleccionar Autenticación Básica

Para instalar soporte de ASP.NET en IIS ejecutar el comando: aspnet_regiis -ir -enable

Page 101: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

101/126

Configuración de IIS

Page 102: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

102/126

Seguridad y NTFS

Una vez que IIS haya identificado adecuadamente al usuario, anónimo o específico, delegará a NTFS

La combinación de permisos asignados a un fichero, mediante el Explorador de Windows, junto con la identidad asignada al usuario que efectúa la solicitud por IIS determinará si el documento solicitado puede devolverse

Hasta este punto el motor ASP.NET no habrá intervenido.

Page 103: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

103/126

El Archivo de Configuración Web.config

Para una app de uso en Intranet la configuración de IIS y autorización de acceso a los archivos será suficiente

Para acceso vía Internet es mejor configurar IIS con acceso anónimo y delegar la autenticación en ASP.NET

Muchos aspectos del funcionamiento de ASP.NET están establecidos en: Los varios ficheros Web.config Machine.config, sus parámetros afectan globalmente al

funcionamiento de ASP.NET

Page 104: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

104/126

Configuración de Seguridad en Machine.config

En mi sistema este fichero se encuentra en: C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\CONFIG

Su contenido principal en cuanto a seguridad está dividido en tres apartados, que indicar cómo identificar usuarios, la representación del usuario y su autorización:<authentication mode="Windows"> <forms name=".ASPXAUTH" loginUrl="login.aspx" protection="All"

timeout="30" path="/" requireSSL="false" slidingExpiration="true"> <credentials passwordFormat="SHA1"> </credentials> </forms> <passport redirectUrl="internal"/></authentication><identity impersonate="false" userName="" password=""/><authorization> <allow users="*"/></authorization>

Page 105: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

105/126

Métodos de Identificación

El elemento authentication establece el método de identificación que usará ASP.NET: None acceso abierto Windows ASP.NET utilizará la identificación integrada de

Windows Forms prescinde de la autorización de Windows y utiliza un

formulario web para identificar al usuario Passport ASP.NET utilizará el SDK de Windows Passport

Page 106: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

106/126

Autorización de Acceso

Se configura a través del elemento authorization Por cada documento solicitado se comprobará una lista de

concesiones y negaciones representadas por los elementos allow y deny.

Cada elemento allow o deny consta de los tres atributos siguientes: users: enumerará los usuarios a los que se otorgo o deniega la

autorización de acceso roles: con este atributo se autoriza o deniega el acceso a perfiles,

grupos de usuarios representados por un nombre verbs: permite indicar el método de solicitud GET o POST

Page 107: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

107/126

Representación del Usuario

Los atributos del elemento identity determinarán qué personalidad de qué usuario deberá tomar ASP.NET: impersonate: indica si ASP.NET (true) debe o NO

(false) debe representar al usuario userName: el nombre de la cuenta a usar password: la contraseña del userName

Page 108: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

108/126

La interfaz IPrincipal

Cuando se produce la identificación de un usuario, ASP.NET crea un objeto que implementa Iprincipal

WindowsPrincipal y GenericPrincipal son dos implementaciones de esta interfaz

La interfaz IPrincipal expone dos miembros: Identity IsInRole

Page 109: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

109/126

Ejemplo SecurityExample

Revisarlo en examples/SecurityExample Este ejemplo presenta al usuario un formulario de login y

le redirecciona a la página del portal cuando el login es correcto

Se han utilizado contraseñas en plano passwordFormat podría tener el formato MD5 y SHA1 Podríamos obtener sus valores a FormsAuthentication.PasswordForStoringInConfigFile()

Page 110: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

110/126

Seguridad en ASP.NET

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/secnetlpmsdn.asp

Page 111: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

111/126

ASP.NET 2.0

Las novedades que proporciona son: Productividad del desarrollador

Nuevo controles Implementan patrones de uso comunes

Gestión y Administración Precompilación de páginas Mejor tolerancia a fallos

Rapidez y Rendimiento Mejores técnicas de caching

Para más detalles: http://www.asp.net/whidbey/whitepapers/AspNetOverview.aspx?tabindex=0&tabid=1

Page 112: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

112/126

AJAX y ASP.NET

Revisar concepto AJAX

Page 113: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

113/126

Novedades ASP.NET 2.0

Novedades en todas aquellas áreas comunes en toda aplicación web: Productividad

Nuevos controles

Flexibilidad y extensibilidad Rendimiento Securidad

Page 114: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

114/126

Novedades ASP.NET 2.0

Objetivos: Incrementar la productividad Eliminar la complejidad Permitir que la construcción de páginas web sea mucho más

sencilla Mejoras:

Trabajando con datos Diseño de páginas consistente Seguridad y Personalización Nuevos controles

Page 115: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

115/126

Trabajando con Datos

Nuevos controles de acceso a datos como SqlDataSource Nuevos controles web para visualizar datos: GridView,

DetailsView, FormView Soportan ordenación y paginado

Ejemplo sencillo que permite visualizar los datos de una BBDD en una tabla:<asp:SqlDataSource id="ds1" runat="server" ConnectionString="Server=.;Database=Northwind; Trusted_Connection=True" SelectCommand="SELECT CompanyName, Address, City, PostalCode, Country FROM Customers WHERE Country LIKE ' Brazil'" /><asp:GridView id="grid1" runat="server" DataSourceID="ds1"

/>

Page 116: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

116/126

Diseño de Páginas Consistente

Páginas maestras: Permiten crear el formato de todas tus páginas como una sola plantilla y

luego insertar el contenido en cada página El webcontrol ContentPlaceHolder define una región de la página maestra

que puede substituirse con contenido de la página asociada En la página que usa el Maestro poner <%@ Page MasterPageFile="Site.master" %>

Dentro de la página usar elementos asp:Content Incluye cabeceras, imágenes menús y otro contenido que luego se puede

cambiar para modificar la apariencia de todo un portal Controles:

Controles Menu y TreeView para proveer un menú visible en la página SiteMapPath, indica la posición de la página actual entre la jerarquía de

páginas Otros controles: SiteMapDataSource e ImageMap Otros aspectos: temas, soporte para accesibilidad e

internacionalización Ejemplo: GridViewMasterDetailsInsert.aspx

Page 117: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

117/126

Seguridad e Internacionalización

Control Login que visualiza el nombre de usuario y contraseña

Controles LoginName y LoginStatus visualizan el nombre y estado del usuario actual

Control PasswordRecovery visualiza un Asistente para recuperar la password de un usuario

Usa plantillas con el control LoginView para visualizar información dependiendo del estado del usario

Soporte para la personalización WebParts permiten crear bloques de UI reutilizables

Page 118: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

118/126

Nuevos Controles

Tales como: HtmlHead, HtmlTitle, HtmlLink, HtmlPassword, HtmlInputReset y HtmlInputSubmit

FileUpload BulletedList HiddenField MultiView y View permiten hacer que partes de una

página se muestren o desaparezcan

Page 119: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

119/126

Control GridView

El control GridView es un control de asociación de datos en ASP.NET 2.0 para renderizar datos en forma tabular Cada fila corresponde a un registro de datos y las columnas corresponden a los

campos del registro GridView es un reemplazo del control DataGrid de ASP.NET 1.x

Soporta las siguientes características: Asociando a controles de datos Capacidad de ordenamiento, actualización, paginado, selección de filas y borrado

integradas Acceso programático al GridView para cambiar sus propiedades y eventos Nuevos tipos de columnas como CheckBoxField e ImageField. Campos de datos múltiples para columnas con hipervínculo Campos clave múltiples para selección, actualización y borrado Apariencia personalizable a través de temas y estilos

Page 120: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

120/126

Strings de Conexión

SqlDataSource referencia un string de conexión a base de datos mediante un nombre usando una nueva sintaxis declarativa in ASP.NET 2.0. El string de conexión es guardado en el fichero Web.config bajo el elemento

<connectionStrings>, por lo que es fácilmente mantenido para todas las páginas en una aplicación

Ejemplo:<configuration> <connectionStrings> <add name="Pubs" connectionString="Server=(local);Integrated Security=True;Database=pubs;"

providerName="System.Data.SqlClient" /> </connectionStrings> </configuration>

La configuración de strings en Web.config es una buena práctica recomendada para cualquier aplicación ASP.NET tanto para gestión centralizada como por motivos de seguridad

Page 121: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

121/126

Ordenación y Paginado

El control SqlDataSource permite ordenación cuando: Su propiedad DataSourceMode está asociada a DataSet

En un GridView: Para ordenación hay que poner su propiedad AllowSorting a

true. Para paginado AllowPaging a true.

Se pueden personalizar los estilos y configuración del paginado mediante PagerStyle y PagerSettings.

Ejemplos: GridViewXXX.aspx

Page 122: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

122/126

Aplicando Estilos, Temas y Pieles

Estilos en controles <input type="radio" name="Mode" style="width:50;background-

color:red;zoom:200%" runat="server"/>Option 2<br> Temas y Pieles

Permiten factorizar información de estilo y layout en un grupo separado de ficheros, denominado Tema.

Un Tema puede aplicarse a cualquier site para afectar el look and feel de sus páginas y controles

Los cambios de estilo pueden simplificarse por centralizarse en un único fichero. Ejemplo: StyledCalendar.aspx

<%@ Page Language="C#" Theme="ExampleTheme" %>

Page 123: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

123/126

Beneficios de los Temas

Beneficios: Permite especificar estilos en tu portal separadamente de tu página y aplicación Se puede diseñar una página sin estilos y luego aplicarse más tarde Pueden descarse y aplicarse estilos provenientes de otras partes

Un fichero de piel contiene definiciones de controles, cuyas definiciones automáticamente sobrescriben el valor de la propiedad local en una página en la que se aplique el tema.

Por ejemplo: <asp:Calendar Font-Name="Verdana" runat="server"/> causará que todos los

controles calendario en páginas a las que se ha asociado el tema se muestren con la fuente Verdana

Un fichero de skins contiene normalmente una definición por cada control, no incluir el atributo ID.

Ejemplo: ThemedASP_Pages.aspx

Page 124: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

124/126

Controles WebPart

Permiten añadir contenido personalizado, de formato y rico, manipulable desde tu página, a tu portal Web Part Controls Layout dinámico y modular, contenido personalizado

Basados en los servicios de personalización de ASP.NET 2.0

Cualquier control puede convertirse facilmente en un Webpart.

Ejemplo: WebPartPageMenu.ascx y WebPart.aspx

Page 125: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

125/126

Otros aspectos

El directorio App_Code permite compartir código entre varias páginas Redirigiendo a otra página:

Response.Redirect("Controls_NavigationTarget_cs.aspx?name=" + System.Web.HttpUtility.UrlEncode(Name.Text));

SiteMapPath, menús y treeviews Creating the Application Services Database for SQL Server

aspnet_regsql.exe -E -S localhost\SQLExpress -A mr

Page 126: Cliente Ligero en.NET Tema 4 – ASP.NET   Dr. Diego

126/126

Referencias

New features for web developers in ASP.NET 2.0 http://dnjonline.com/article.aspx?ID=dotNET2_webapps

ASP.NET 2.0 QuickStart Tutorial http://quickstarts.asp.net/QuickStartv20/aspnet/

Internacionalización en ASP.NET http://www.c-sharpcorner.com/UploadFile/mosessaur/

aspnetlocalization02042006165851PM/aspnetlocalization.aspx?ArticleID=96602e53-0fb1-44ec-a67b-1c68b05eb2e1