Cliente Ligero en NET Tema 4 ASP NET

  • Slides: 126
Download presentation
Cliente Ligero en. NET Tema 4 – ASP. NET http: //paginaspersonales. deusto. es/dipina/Master. ISW/

Cliente Ligero en. NET Tema 4 – ASP. NET http: //paginaspersonales. deusto. es/dipina/Master. ISW/ 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) Fundación Deusto - Tecnológico Deusto

ASP. NET n n Sucesor de Microsoft a la popular plataforma ASP para el

ASP. NET n n Sucesor de Microsoft a la popular plataforma ASP para el desarrollo de aplicaciones web Configuración: ¨ Atención: Si no funciona, re-registrar l aspnet_regiis. exe -i ASP. NET bajo IIS: 2

Ejemplo HTML: simple. html <html> <body> Hola mundo </body> </html> 3

Ejemplo HTML: simple. html <html> <body> Hola mundo </body> </html> 3

Ejemplo Petición HTTP GET /simple. html HTTP/1. 1 Accept: */* Accept-Language: en-us Accept-Encoding: gzip,

Ejemplo Petición HTTP GET /simple. html HTTP/1. 1 Accept: */* Accept-Language: en-us Accept-Encoding: gzip, deflate If-Modified-Since: Wed, 24 Oct 2001 14: 12: 36 GMT If-None-Match: "50 b 0 d 3 ee 955 cc 11: a 78" User-Agent: Mozilla/4. 0. (compatible; MSIE. 6. 0; Windows NT 5. 1) Host: www. wintellect. com Connection: Keep-Alive [blank line] 4

Ejemplo Respuesta HTTP/1. 1 200 OK Server: Microsoft-IIS/5. 0 Date: Wed, 24 Oct 2001

Ejemplo Respuesta HTTP/1. 1 200 OK Server: Microsoft-IIS/5. 0 Date: Wed, 24 Oct 2001 14: 12: 37 GMT Content-Type: text/html Accept-Ranges: bytes Last-Modified: Wed, 24 Oct 2001 14: 00: 53 GMT ETag: "d 02 acf 81975 cc 11: a 78" Content-Length: 46 [blank line] <html> <body> Hola mundo </body> </html> 5

ASP. NET vs. ASP n Active Server Pages (ASP) ofrecen un simple modelo de

ASP. NET vs. ASP n Active Server Pages (ASP) ofrecen un simple modelo de programación en el que se puede combinar código fuente y de marcado ¨ n 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 ‘%>’ 6

Ejemplo ASP <!-- hello. asp --> <script language="VBScript" runat="server"> function build. Form() first. Name

Ejemplo ASP <!-- hello. asp --> <script language="VBScript" runat="server"> function build. Form() first. Name = Trim(Request. Form("first. Name")) s = "" if first. Name = "" then ' need a name. . . s = s & "What's Your First Name? " s = s & "<input type='text' name='first. Name' />" s = s & "<input type='submit' />" else ' we know the user's name. . . s = s & "Hello, " & first. Name & "!" end if build. Form = s end function </script> <html><head><title>Hello ASP App</title></head> <body> <h 1>Hello ASP Application</h 1> <form action='hello. asp' method='POST'> <%=build. Form()%> </form> </body> </html> 7

ASP. NET n n Los ficheros ASP. NET tienen extensión aspx. El código en

ASP. NET n n 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 8

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

Ejemplo ASP. NET <!-- hello. aspx --> <%@ Page Language="C#"%> <%@ Import Namespace="System. Web. UI"%> <script runat="server"> private string build. Form() { string first. Name = this. Request. Form["first. Name"]; if (first. Name == null) first. Name = ""; string s = ""; if (first. Name. Trim() == "") { // need a name. . . s += "What's Your First Name? "; s += "<input type='text' name='first. Name' />"; s += "<input type='submit' />"; } else { // we know the user's name. . . s += "Hello, " + this. Request. Form["first. Name"] + "!"; } return s; } </script> <html><head><title>Hello ASP. NET App</title></head> <body> <h 1>Hello ASP. NET Application</h 1> <form action='hello. aspx' method='POST'> <%=build. Form()%> </form> </body> </html> 9

La clase System. Web. UI. Page n En el anterior listado encontramos la línea:

La clase System. Web. UI. Page n En el anterior listado encontramos la línea: string first. Name = this. Request. Form[“first. Name”]; ¨ 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 n n Los objetos Request y Response de ASP son ahora propiedades de la clase Page El siguiente ejemplo muestra algunas de las propiedades de Request 10

Usando Page. Request y Page. Response I <!-- dumpprops. aspx --> <%@ Page Language="C#"

Usando Page. Request y Page. Response I <!-- dumpprops. aspx --> <%@ Page Language="C#" Debug="true"%> <script runat="server"> private void dump. Props() { // get Request and Response objects. . . Http. Request req = this. Request; Http. Response resp = this. Response; // and use them. . . resp. Write("Request. File. Path: " + req. File. Path + "<br/>"); resp. Write("Request. Physical. Application. Path: " + req. Physical. Application. Path + "<br/>"); resp. Write("Request. Http. Method: " + req. Http. Method + "<br/>"); resp. Write("Request. User. Agent: " + req. User. Agent + "<br/>"); resp. Write("Request. User. Host. Address: " + req. User. Host. Address + "<br/>"); } </script> <html><head><title>Dump Page Properties</title></head> <body> <h 1>Page Properties</h 1> <% dump. Props(); %> </body> </html> 11

Usando Page. Request y Page. Response II 12

Usando Page. Request y Page. Response II 12

Recuperando Datos de Formularios con Request n Propiedades: ¨ Request. Type: l Usando GET

Recuperando Datos de Formularios con Request n Propiedades: ¨ Request. Type: l Usando GET recuperaríamos los datos de Query. String l l Usando POST de la propiedad Form l l Control=Valor&Control=Valor Request. Form["Direccion"] La propiedad Params incluye además de los datos de un formulario, las cookies y las variables del servidor 13

Formulario ASP. NET n Un elemento FORM en el que no aparece ni action

Formulario ASP. NET n Un elemento FORM en el que no aparece ni action ni method ¨ Estos atributos son substituidos por runat="server" l Indica que el motor ASP. NET debe procesar el contenido del formulario l n Controles asp: Text. Box, 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 Query. String o Params. 14

Ciclo de Vida del Objeto Page n Cuando una petición HTTP es recibida ASP.

Ciclo de Vida del Objeto Page n 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: ¨ l l On. Init inicialización requerida por la página On. Load ejecuta acciones comunes a cada petición HTTP de un página On. Pre. Render para hacer cualquier cosa antes que la página se visualice On. Unload sirve para realizar tareas como desconectarse de una base de datos cuando la página se descarga 15

Manejando Eventos de Página <!-- pageevents. aspx --> <%@ Page Language="C#" Debug="true" %> <script

Manejando Eventos de Página <!-- pageevents. aspx --> <%@ Page Language="C#" Debug="true" %> <script runat="server"> protected override void On. Init(Event. Args e) { base. On. Init(e); p("Init"); } protected override void On. Load(Event. Args e) { base. On. Load(e); p("Load"); } protected override void On. Pre. Render(Event. Args e) {base. On. Pre. Render(e); p("Pre. Render"); } private void p(string s) { Message. Inner. Html += s + " "; } </script> <html><head><title>Hello Web Page</title></head> <body> <h 1>Page Events. . . </h 1> <form action='pageevents. aspx' method='POST'> <span id="Message" runat="server" /> <p> <input type="submit" /> </p> </form> </body> </html> 16

Creando un Directorio Virtual I n Creamos el directorio virtual ejemplos. ASP. NET: 1.

Creando un Directorio Virtual I n Creamos el directorio virtual ejemplos. ASP. NET: 1. 2. Hacemos doble click en Herramientas Administrativas Doble click en Internet Information Services 17

Creando un Directorio Virtual II n Creamos el directorio virtual ejemplos. ASP. NET: 3.

Creando un Directorio Virtual II n Creamos el directorio virtual ejemplos. ASP. NET: 3. 4. Hacemos clic con el botón derecho del ratón en Default Web Site y luego seleccionamos New Virtual Directory Seleccionamos el directorio donde vamos a dejar los fichero accesibles por el contexto ‘ejemplos. ASP. NET’ 18

Web Forms y Server Controls n n n Un Web Form es un formulario

Web Forms y Server Controls n n n 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 Java. Script que son enviados al navegador 19

Ejemplo Web Form I <!-- helloform. aspx --> <%@ Page Language="C#" Debug="true" %> <script

Ejemplo Web Form I <!-- helloform. aspx --> <%@ Page Language="C#" Debug="true" %> <script runat="server"> // greet the user. . . private void greet. Handler(object sender, Event. Args e) { first. Name. Text. Box. Text = first. Name. Text. Box. Text. Trim(); if (first. Name. Text. Box. Text == "") { // no name, so no greeting. . . greeting. Label. Text = ""; } else { // greet the user. . . greeting. Label. Text = "Hello, " + first. Name. Text. Box. Text + "!"; } } </script> 20

Ejemplo Web Form II <html><head><title>Hello Web Form</title></head> <body> <h 1>Hello Web Form</h 1> <form

Ejemplo Web Form II <html><head><title>Hello Web Form</title></head> <body> <h 1>Hello Web Form</h 1> <form action='helloform. aspx' method='POST' runat='server'> <asp: label text="What's Your First Name? " runat="server"/> <asp: textbox id="first. Name. Text. Box" runat="server"/> <asp: button id="greet. Button" text="Greet" On. Click="greet. Handler" runat="server"/> <p><asp: label id="greeting. Label" runat="server"/></p> </form> </body> </html> 21

Ejemplo Web Form III n Puntos de interés: ¨ Declaración del formulario mediante <form

Ejemplo Web Form III n 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"/> l Estas etiquetas corresponden a los controles de la parte servidora l Se transforman en HTML por ASP. NET 22

Ejemplo Web Form IV 23

Ejemplo Web Form IV 23

Ejemplo Web Form V n Los controles del servidor preservan su valor a través

Ejemplo Web Form V n Los controles del servidor preservan su valor a través de peticiones HTTP ¨ Lo hacen guardando las propiedades en un variable de nombre __VIEWSTATE l n 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=“greet. Button” text=“Greet” On. Click=“greet. Handler” runat=“server”/> ¨ El manejador de eventos tiene una firma similar al equivalente en Windows Forms: private void greet. Handler(object sender, Event. Args e) { … } n Podemos sobrescribir el método On. Load y también usar el enfoque delegate: protected override void On. Load(Event. Args e) { base. On. Load(e); // uso delegate … greet. Button. Click += new Event. Handler(greet. Handler); } 24

Codificación Base 64 n n n Subconjunto de 64 caracteres ASCII que permiten a

Codificación Base 64 n n n 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/Base 64 25

System. Web. UI. Web. Controls y System. Web. UI. Html. Controls n El espacio

System. Web. UI. Web. Controls y System. Web. UI. Html. Controls n El espacio de nombres System. Web. UI. Web. Controls define un montón de controles, entre ellos: ¨ ¨ ¨ ¨ ¨ n Button Calendar Check. Box. List Data. Grid Data. List Drop. Down. List Label Panel Etc. En System. UI. Html. Controls se definen una serie de controles como Html. Anchor y Html. Table que definen una correspondencia uno-a-uno con la etiqueta HTML equivalente, p. e. , Html. Anchor y Html. Table 26

System. Web. UI. Web. Controls y System. Web. UI. Html. Controls n Al insertar

System. Web. UI. Web. Controls y System. Web. UI. Html. Controls n Al insertar usando el Toolbox de Visual Studio. NET controles HTML obtenemos: ¨ ¨ ¨ n <input type=“text”/> <input type=“checkbox”/> <input type=“button” value=“Button”/> Al insertar web controls obtenemos: ¨ ¨ ¨ <asp: Text. Box id=“Text. Box 1” runat=“server”> </asp: Text. Box> <asp: Check. Box id=“Check. Box 1” runat=“server”> </asp: Check. Box> <asp: Button id=“Button 1” runat=“server”> </asp: Button> 27

Propiedades Interesantes de los Web. Controls n Estilo Visual Height y Width ¨ Backcolor

Propiedades Interesantes de los Web. Controls n Estilo Visual Height y Width ¨ Backcolor y Fore. Color ¨ Border. Color, Border. Style y Border. Width ¨ n Propiedades de comportamiento ¨ ¨ ¨ n Enabled Visible Access. Key Tab. Index Read. Only Generación de Eventos ¨ Auto. Post. Back l Indica si el control ha de producir automáticamente una nueva solicitud al servidor 28

Mantenimiento de Estado en Controles n La propiedad Enable. View. State determina si un

Mantenimiento de Estado en Controles n La propiedad Enable. View. State determina si un control ASP. NET debe mantener su estado entre solicitudes ¨ Su n valor por defecto es True El campo oculto __VIEWSTATE es el mecanismo utilizado por ASP. NET para conservar estado 29

Usando el Control Calendar <!-- calendarform. aspx --> <%@ Page Language="C#" Debug="true" %> <script

Usando el Control Calendar <!-- calendarform. aspx --> <%@ Page Language="C#" Debug="true" %> <script runat=server> private void date. Handler(object sender, Event. Args e) { my. Message. Text = "You selected " + my. Calendar. Selected. Date. To. Short. Date. String(); } </script> <html><head><title>Calendar ASP. NET App</title></head> <body> <h 1>Calendar ASP. NET Application</h 1> <form runat="server"> <asp: calendar id="my. Calendar" on. Selection. Changed="date. Handler" Font-Name="Verdana" Font-Size="8 pt" Font-Bold="true" Border. Color="black" Back. Color="Gainsboro" runat="server" /> <p> <asp: Label id="my. Message" Font-Name="Verdana" Font-Size="8 pt" Font-Bold="true" runat="server" /> </p> </form> </body> </html> 30

Usando el Control Calendar 31

Usando el Control Calendar 31

Usando el Control Data. Grid I <!-- dataformexample. aspx --> <%@ Page Language="C#" %>

Usando el Control Data. Grid I <!-- dataformexample. aspx --> <%@ Page Language="C#" %> <%@ Import Namespace="System. Data. Sql. Client" %> <script runat="server"> protected override void On. Load(Event. Args e) { base. On. Load(e); Sql. Connection con = new Sql. Connection("server=<servername>; database=pubs; uid=sa; pwd=<password>"); Sql. Data. Adapter com = new Sql. Data. Adapter("select * from titles", con); Data. Set ds = new Data. Set(); com. Fill(ds, "titles"); titles. Grid. Data. Source=ds. Tables["titles"]. Default. View; titles. Grid. Data. Bind(); } </script> 32

Usando el Control Data. Grid II <html><head><title>Data. Grid ASP. NET App</title></head> <body> <h 1>Data.

Usando el Control Data. Grid II <html><head><title>Data. Grid ASP. NET App</title></head> <body> <h 1>Data. Grid ASP. NET Application</h 1> <form runat="server"> <asp: data. Grid id="titles. Grid" Back. Color="Gainsboro" Border. Color="black" Cell. Padding="10" Cell. Spacing="0" Font-Name="Verdana" Font-Size="8 pt" Font-Bold="true" Header. Style-Back. Color="light. Green" Enable. View. State="false" runat="server" /> </form> </body> </html> 33

Usando el Control Data. Grid III n n n <asp: data. Grid …/> visualiza

Usando el Control Data. Grid III n n n <asp: data. Grid …/> visualiza el Data. Grid en el formulario Para cargar datos en el grid, usamos su propiedad Data. Source y le asociamos datos invocando a Data. Bind() Data. Grid soporta paginamiento: Page. Size indica el número de filas a visualizar por página ¨ Allow. Paging sirve para visualizar botones Previous and Next en la página ¨ 34

Usando el Control Data. Grid III 35

Usando el Control Data. Grid III 35

Usando Data. Grid IV n Una pregunta frecuente suele ser cómo añadir un hiperlink

Usando Data. Grid IV n Una pregunta frecuente suele ser cómo añadir un hiperlink a una de las celdas de un Data. Grid: ¨ http: //msdn. microsoft. com/library/default. asp? url=/librar y/enus/vbcon/html/vbtskaddinghyperlinkcolumnstodatagrid webcontrol. asp 36

Usando Data. Grid V <%@ Page language="c#" Codebehind="Web. Form 1. aspx. cs" Auto. Event.

Usando Data. Grid V <%@ Page language="c#" Codebehind="Web. Form 1. aspx. cs" Auto. Event. Wireup="false" Inherits="Data. Grid. With. Hyperlink. Web. Form 1" %> <!DOCTYPE HTML PUBLIC "-//W 3 C//DTD HTML 4. 0 Transitional//EN" > <HTML> <HEAD> <title >Web. Form 1</title> <meta content="Microsoft Visual Studio. NET 7. 1" name="GENERATOR"> <meta content="C#" name="CODE_LANGUAGE"> <meta content="Java. Script" name="vs_default. Client. Script"> <meta content="http: //schemas. microsoft. com/intellisense/ie 5" name=" vs_target. Schema"> </HEAD> <body MS_POSITIONING="Grid. Layout"> <form id="Form 1" method="post" runat="server"> <asp: Data. Grid id="Data. Grid 1" style="Z-INDEX: 101; LEFT: 192 px; POSITION: absolute; TOP: 104 px“ runat="server" Data. Source="<%# Titles. Data. Set %>" Auto. Generate. Columns="False"> <Columns> <asp: Hyper. Link. Column Data. Text. Field="title_id" Header. Text="title_id" Navigate. Url="http: //paginaspersonales. deusto. es/dipina"></asp: Hyper. Link. Colum n> <asp: Bound. Column Data. Field="title" Sort. Expression="title" Header. Text="title"></asp: Bound. Column> <asp: Bound. Column Data. Field="type" Sort. Expression="type" Header. Text="type"></asp: Bound. Column> <asp: Bound. Column Data. Field="pub_id" Sort. Expression="pub_id" Header. Text="pub_id"></asp: Bound. Column> </Columns> </asp: Data. Grid> </form> </body> </HTML> 37

Usando el control Html. Table I <!-- tableform. aspx --> <%@ Page Language="C#" Debug="true"

Usando el control Html. Table I <!-- tableform. aspx --> <%@ Page Language="C#" Debug="true" %> <%@ Import Namespace="System"%> <%@ Import Namespace="System. Web. UI"%> <script runat="server"> protected override void On. Load(Event. Args e) { base. On. Load(e); int cell. Num = 0; if (Is. Post. Back) { // falso cuando el formulario se crea por primera vez try { cell. Num = Int 32. Parse(cell. Text. Box. Text); } catch (Exception) { cell. Num = 0; // don't highlight any cell } } int rows = 3, cols = 3, num = 0; for (int i = 0; i < rows; i++) { Html. Table. Row html. Row = new Html. Table. Row(); for (int j = 0; j < cols; j++) { num++; Html. Table. Cell html. Cell = new Html. Table. Cell(); html. Cell. Controls. Add(new Literal. Control(num. To. String())); if (num == cell. Num) html. Cell. Bg. Color="Yellow"; html. Row. Cells. Add(html. Cell); } my. Table. Rows. Add(html. Row); } } </script> 38

Usando el control Html. Table II <html><head><title>Html. Table Example</title></head> <body> <h 1>Html. Table Example</h

Usando el control Html. Table II <html><head><title>Html. Table Example</title></head> <body> <h 1>Html. Table Example</h 1> <form runat="server"> <table id="my. Table" border="1" cell. Padding="10" cell. Spacing="1" runat="server" /> <p> Cell# <asp: textbox id="cell. Text. Box" columns="1" max. Length="1" runat="server"/> <input type="submit" value="Highlight Cell" runat="server"> </p> </form> </body> </html> 39

Usando el control Html. Table I n n La propiedad de una página Is.

Usando el control Html. Table I n n La propiedad de una página Is. Post. Back es falsa cuando un formulario se carga por primera vez Obsérvese cómo programáticamente podemos ir creando la tabla: ¨ Html. Table ¨ Html. Row ¨ Html. Cell 40

Controles de Usuario n Podemos crear tres tipos de controles: ¨ Pagelets l Fragmentos

Controles de Usuario n Podemos crear tres tipos de controles: ¨ Pagelets l Fragmentos de código HTML que pueden reutilizarse como si de componentes se tratara ¨ Controles simples l Derivados de System. Web. UI. Control ¨ Controles compuestos l Reutilizan uno o más controles ya existentes l Los especializan 41

Creación de Pagelets n Es un conjunto de marcas HTML alojadas en un archivo

Creación de Pagelets n Es un conjunto de marcas HTML alojadas en un archivo independiente y que se pueden reutilizar ¨ n n Podemos personalizar ese contenido a través de propiedades Se alojan en ficheros con extensión. ascx Contienen marcado: <br/> <p>Distributed. NET</p> n Tendremos que registrar este fragmento, le damos un nombre y le asociamos un prefijo, en todos los. aspx donde queramos utilizar este control <%@ Register Tag. Prefix="DN" Tag. Name=“Firma“ Src=“Firma. ascx" %> 42

Creación de Pagelets <%@ Register Tag. Prefix="DN" Tag. Name= "Firma" Src= "Firma. ascx“ %>

Creación de Pagelets <%@ Register Tag. Prefix="DN" Tag. Name= "Firma" Src= "Firma. ascx“ %> n n 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="Firma 1" runat="server" ></DN: Firma> n runat="server" lo identifica como control del servidor, ASP. NET lo substituirá por el código asociado 43

Pagelets con propiedades n ¿Cómo personalizar un pagelet? ¨ n Tan sencillo como declarar

Pagelets con propiedades n ¿Cómo personalizar un pagelet? ¨ n Tan sencillo como declarar variables públicas Ejemplo: <script language="C#" runat="server"> public string Background. Color="white"; public int Border. Width = 1; public string Text="Distributed. NET"; </script> <div style="clear; left; background-color: <%=Background. Color%>; border: solid <%=Border. Width%>px"> <p style="text-align: center"><%=Text%></p> </div> 44

Pagelets con propiedades n A continuación incluiríamos el siguiente fragmento en el. aspx donde

Pagelets con propiedades n A continuación incluiríamos el siguiente fragmento en el. aspx donde incluir esta cabecera <%@ Register Tag. Prefix="DN" Tag. Name= "Cabecera" Src= "Cabecera. ascx" %> n Y en el código del. aspx podríamos crear entradas como: <DN: Cabecera id="Pie" runat="server" Border. Width="3" Text="Pie de página"></DN: Cabecera> n Revisar ejemplo en examplesasp. netSecurity. Example 45

Creando Controles Web de Usuario con Pagelets n Permite encapsular dos o más elementos

Creando Controles Web de Usuario con Pagelets n Permite encapsular dos o más elementos de interfaz en un control reusable ¨ n n 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> ¨ 46

Usercolor. ascx I <!-- usercolor. ascx --> <script language="C#" runat="server"> public string Color {

Usercolor. ascx I <!-- usercolor. ascx --> <script language="C#" runat="server"> public string Color { get { if (color. Text. Box. Text == "") return "white"; return color. Text. Box. Text; } } public bool Visible { get { return color. Panel. Visible; } set { color. Panel. Visible = value; } } </script> 47

Usercolor. ascx II <asp: panel id="color. Panel" visible="false" runat="server"> <asp: label Font-Name="Verdana" Font-Size="7 pt"

Usercolor. ascx II <asp: panel id="color. Panel" visible="false" runat="server"> <asp: label Font-Name="Verdana" Font-Size="7 pt" text="Color : " runat="server"/> <asp: textbox Font-Name="Verdana" Font-Size="7 pt" columns="10" id="color. Text. Box" runat="server"/> </asp: panel> 48

Usercolor. ascx III n n n Este control está compuesto de una label y

Usercolor. ascx III n n n 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 Tag. Prefix="user. Colors" Tag. Name="user. Color" Src="usercolor. ascx" %> n Para usar el control hacemos: <user. Colors: user. Color id="user. Color. Control" runat="server"/> 49

Colorform. aspx I <%@ Page Language="C#" Debug="true" %> <%@ Register Tag. Prefix="user. Colors" Tag.

Colorform. aspx I <%@ Page Language="C#" Debug="true" %> <%@ Register Tag. Prefix="user. Colors" Tag. Name="user. Color" Src="usercolor. ascx" %> <script runat="server"> protected override void On. Load(Event. Args e) { base. On. Load(e); body. Attributes["bgcolor"] = user. Color. Control. Color; user. Color. Control. Visible = !user. Color. Control. Visible; } </script> <html><head><title>The User. Color Control</title></head> <body id="body" runat="server"> <h 1>The User. Color Control</h 1> <form runat='server'> <user. Colors: user. Color id="user. Color. Control" runat="server"/> <p> This form uses the User. Color 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="7 pt" Border. Color="black" type="submit" runat="server"/> </form> </body> </html> 50

Colorform. aspx II 51

Colorform. aspx II 51

Custom Controls n n n Se diferencian de los controles de usuario en que

Custom Controls n n n 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 Web. Control. Library 1 A continuación añadimos el proyecto Web. Application. Using. Custom. Control 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. Web. Controls. Web. Control 52

Custom Control Cabecera de nuevo n n Podemos o bien reimplementar el método Render()

Custom Control Cabecera de nuevo n n Podemos o bien reimplementar el método Render() de Web. Control que renderiza el contenido de un control O mejor redefinir los métodos: ¨ Add. Attributes. To. Render() agrega nuevos contenidos y atributos ¨ Render. Contents() invoca a la implementación base de Render 53

Creando un Control Compuesto con Código n n No genera su interfaz, se basa

Creando un Control Compuesto con Código n n No genera su interfaz, se basa en otros controles ya existentes Los controles se añaden al control de usuario en el método Create. Child. Controls() 54

Creando un Control Compuesto con Código public class Web. Custom. Control 1 : Control,

Creando un Control Compuesto con Código public class Web. Custom. Control 1 : Control, INaming. Container { private Text. Box euros, pesetas; protected override void Create. Child. Controls() { this. euros = new Text. Box(); this. pesetas = new Text. Box(); euros. Text = "0"; euros. Auto. Post. Back = true; euros. Text. Changed += new Event. Handler(Euros_Text. Changed); pesetas. Text = "0"; pesetas. Auto. Post. Back = true; pesetas. Text. Changed += new Event. Handler(Pesetas_Text. Changed); this. Controls. Add(this. euros); this. Controls. Add(new Literal. Control("€<br/>")); this. Controls. Add(this. pesetas); this. Controls. Add(new Literal. Control("Pts")); } private void Euros_Text. Changed(object sender, Event. Args e) { pesetas. Text = (Math. Round(Convert. To. Double(euros. Text) * 166. 386)). To. String(); } private void Pesetas_Text. Changed(object sender, Event. Args e) { euros. Text = (Math. Round(Convert. To. Double(pesetas. Text) / 166. 386)). To. String(); } } 55

Validando la Entrada de Datos n La plataforma Web Forms provee una selección de

Validando la Entrada de Datos n La plataforma Web Forms provee una selección de controles de validación que sirven para: ¨ ¨ n 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 ¨ ¨ n Validar la entrada de datos Mostrar mensajes de error al usuario Validator. Collection es el tipo de la colección Los validadores derivan todos de Base. Validator 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 Causes. Validation 56

Validando la Entrada de Datos n Los controles de validación proporcionados son: ¨ ¨

Validando la Entrada de Datos n Los controles de validación proporcionados son: ¨ ¨ ¨ Required. Field. Validator Compare. Validator compara una entrada con un valor o la propiedad de otro control Range. Validator entrada en un rango de valores Regular. Expression. Validator requiere que una entrada se corresponda con una expresión regular Custom. Validator validación propietaria codificada por usuario Validation. Summary muestra un resumen de errores de validación para todos los controles de validación en una página 57

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

Validando la Edad I <!-- ageform. aspx --> <%@ Page Language="C#" Debug="true" %> <script runat="server"> private void age. Handler(object sender, Event. Args e) { if (Is. Valid) age. Label. Text = "You are " + age. Text. Box. Text + " years old. "; else age. Label. Text = "Please Enter Your Age. "; } </script> <html><head><title>Validating a User's Age</title></head><body> <form runat='server'> <h 1>Validating a User's Age</h 1> <asp: label text="Age : " runat="server"/> <asp: textbox id="age. Text. Box" columns="3" max. Length = "3" runat="server"/> <asp: button id="submit. Button" text="Submit" on. Click="age. Handler" runat="server"/> <p> <asp: label id="age. Label" text="Please Enter Your Age. " runat="server"/> </p> 58

Validando la Edad II <!-- require an entry. . . --> <asp: required. Field.

Validando la Edad II <!-- require an entry. . . --> <asp: required. Field. Validator control. To. Validate="age. Text. Box" error. Message="Age required" enable. Client. Script="true" display="static" runat=server /><br/> <!-- must be an integer. . . --> <asp: regular. Expression. Validator control. To. Validate="age. Text. Box" error. Message="Age must be an integer" enable. Client. Script="true" display="static" validation. Expression="^d{1, 3}$" runat="server" /><br/> <!-- must be aged between 1 and 120 years. . . --> <asp: range. Validator control. To. Validate="age. Text. Box" error. Message="Age must be between 1 and 120 years" enable. Client. Script="true" display="static" type="Integer" minimum. Value="1" maximum. Value="120" runat="server" /> <hr/> </form> </body></html> 59

Validando la Edad III n Los controles utilizados tienen las siguientes propiedades en común:

Validando la Edad III n Los controles utilizados tienen las siguientes propiedades en común: control. To. Validate especifica el control a validar (age. Text. Box) ¨ error. Message el texto de error a visualizar ¨ enable. Client. Script genera Java. Script si el cliente lo permite ¨ display los controles de validación son invisibles por defecto, static crea espacio para visualizar el error ¨ n Si cualquier validación es falsa asigna el valor false a Is. Valid. 60

Validaciones Complejas n n n Mediante Regular. Expression. Validator y Custom. Validator Regular. Expression.

Validaciones Complejas n n n Mediante Regular. Expression. Validator y Custom. Validator Regular. Expression. Validator tiene la propiedad Validation. Expression donde colocaremos una expresión regular Podemos crear nuestra propia función de validación con Custom. Validator Habrá que codificarla en Java. Script y añadirla como un elemento script de HTML ¨ Propiedad esencial Client. Validation. Function ¨ 61

Validaciones Complejas <script> //Función de validación a medida function Verifica. Meses(source, arguments) { if

Validaciones Complejas <script> //Función de validación a medida function Verifica. Meses(source, arguments) { if (arguments. Value >= 6 && arguments. Value <=24 && arguments. Value%6 == 0) arguments. Is. Valid = true; else arguments. Is. Valid = false; } 62

Configurando y Customizando las aplicaciones ASP. NET I n ASP. NET provee un sistema

Configurando y Customizando las aplicaciones ASP. NET I n 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: ¨ ¨ ¨ n n 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: WINNTMicrosoft. NETFramework<versión>CONFIGmachine. config para la máquina ¨ C: Inetpubwwwrootweb. config para el sitio ¨ C: appweb. configuraciones específicas de la aplicación ¨ C: appdirweb. configuraciones específicas del subdirectorio ¨ 63

Configurando y Customizando las aplicaciones ASP. NET II n Las siguientes configuraciones son posibles:

Configurando y Customizando las aplicaciones ASP. NET II n 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 64

Creando un Módulo HTTP Propietario I n n Antes de que una petición sea

Creando un Módulo HTTP Propietario I n n 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 IHttp. Module, compilarla y dejarla en el directorio bin de la aplicación web: l Init: recibe como argumento un Http. Application que define los siguientes eventos: l l ¨ Begin. Request Acquire. Request. State End. Request 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> <http. Modules> <add name="Request Counter Module" type="Cust. Http. Modules. Request. Counter. Module, custhttpmodules"/> </http. Modules> </system. web> </configuration> 65

Creando un Módulo HTTP Propietario II // file : custhttpmodules. cs // compile :

Creando un Módulo HTTP Propietario II // file : custhttpmodules. cs // compile : csc /t: library custhttpmodules. cs using System; using System. Web. Session. State; namespace Cust. Http. Modules { public class Request. Counter. Module : IHttp. Module { public void Init(Http. Application ha) { ha. Acquire. Request. State += new Event. Handler(got. State); } public void Dispose() { // perform any necessary cleanup here } private void got. State(object sender, Event. Args e) { Http. Application ha = (Http. Application)sender; Http. Session. State s = ha. Session; if (s["num. Requests"] == null) { s["num. Requests"] = 1; } else { int num. Requests = (int)s["num. Requests"]; s["num. Requests"] = ++num. Requests; } } 66

Creando un Módulo HTTP Propietario III <!-- dumpreqs. aspx --> <%@ Page Language="C#" Debug="true"%>

Creando un Módulo HTTP Propietario III <!-- dumpreqs. aspx --> <%@ Page Language="C#" Debug="true"%> <script runat="server"> private void dump. Reqs() { string s = "Number of Requests: " + Session["num. Requests"]; Response. Write(s); } </script> <html><head><title>HTTP Request Count</title></head> <body> <h 1>HTTP Request Count</h 1> <% dump. Reqs(); %> </body> </html> 67

Creando un Módulo HTTP Propietario IV 68

Creando un Módulo HTTP Propietario IV 68

Creando un Manejador HTTP I n n A diferencia de un módulo HTTP, un

Creando un Manejador HTTP I n n 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 IHttp. Hander Para instalar el Http. Handler usar las siguientes sentencias en el web. config: <configuration> <system. web> <http. Handlers> <add verb="*" path="hellohandler. aspx" type="Custom. Http. Handlers. Hello. Handler, custhttphandlers" /> </http. Handlers> </system. web> </configuration> 69

Creando un Manejador HTTP II // file : custhttphandlers. cs // compile : csc

Creando un Manejador HTTP II // file : custhttphandlers. cs // compile : csc /t: library custhttphandlers. cs using System. Web; namespace Custom. Http. Handlers { public class Hello. Handler : IHttp. Handler { public void Process. Request(Http. Context hc) { hc. Response. Write("Hello, World!"); } public bool Is. Reusable { get { return true; } } 70

Creando un Manejador HTTP III 71

Creando un Manejador HTTP III 71

Haciendo Debugging de Aplicaciones ASP. NET n Para encontrar problemas en el código de

Haciendo Debugging de Aplicaciones ASP. NET n Para encontrar problemas en el código de un ASP. NET, éste ofrece dos niveles de testeo: ¨ Page-level tracing l l Utiliza la siguiente directiva: <%@ Page Language=“C#” Trace=“true”%> Para insertar tus propios fragmentos de trace usar las sentencias: l ¨ Trace. Write y Trace. Warn Application-level tracing, modificando web. config 72

Tracing a Nivel de Página I <!-- traceform. aspx --> <%@ Page Language="C#" Trace="True"

Tracing a Nivel de Página I <!-- traceform. aspx --> <%@ Page Language="C#" Trace="True" %> <script runat="server"> // greet the user. . . private void greet. Handler(object sender, Event. Args e) { Trace. Warn("*** Entering greet. Handler ***"); first. Name. Text. Box. Text = first. Name. Text. Box. Text. Trim(); Trace. Warn("*** First Name = '" + first. Name. Text. Box. Text + "' ***"); if (first. Name. Text. Box. Text == "") { // no name, so no greeting. . . greeting. Label. Text = ""; Trace. Warn("*** No greeting ***"); } else { // greet the user. . . greeting. Label. Text = "Hello, " + first. Name. Text. Box. Text + "!"; } Trace. Warn("*** Greeting = '" + greeting. Label. Text + "' ***"); } </script> 73

Tracing a Nivel de Página II <html><head><title>Hello Web Form</title></head> <body> <h 1>Hello Web Form</h

Tracing a Nivel de Página II <html><head><title>Hello Web Form</title></head> <body> <h 1>Hello Web Form</h 1> <form action='helloform. aspx' method='POST' runat='server'> <asp: label text="What's Your First Name? " runat="server"/> <asp: textbox id="first. Name. Text. Box" runat="server"/> <asp: button id="greet. Button" text="Greet" On. Click="greet. Handler" runat="server"/> <p><asp: label id="greeting. Label" runat="server"/></p> </form> </body> </html> 74

Tracing a Nivel de Página III 75

Tracing a Nivel de Página III 75

Tracing a Nivel de Aplicación I <configuration> <system. web> <trace enabled="true" local. Only="true“ page.

Tracing a Nivel de Aplicación I <configuration> <system. web> <trace enabled="true" local. Only="true“ page. Output="false“ request. Limit="10“ trace. Mode="Sort. By. Time"/> </system. web> </configuration> n enabled para activar/desactivar el tracing n local. Only hacer tracing sólo en localhost n page. Output true si se pone la información de debugging al final de cada página, o en false en el fichero trace. axd n request. Limit cuántos traces de peticiones a guardar n trace. Mode si se ordenan por tiempo (Sort. By. Time) o categoría (Sort. By. Category) 76

Objetos principales de una aplicación ASP. NET n Response (Http. Response) ¨ ¨ n

Objetos principales de una aplicación ASP. NET n Response (Http. Response) ¨ ¨ n Request (Http. Request) ¨ ¨ ¨ n n Write() Write. File() Binary. Write() Redirect() Request y Response tienen la propiedad Cookies que es una colección Query. String Server. Variables Files ficheros enviados desde el cliente (file uploads) Binary. Read() Save. As() Application (Http. Application. State) Session (Http. Session) 77

Estado de Aplicación en Global. Asax n Los objetos de aplicación son compartidos por

Estado de Aplicación en Global. Asax n Los objetos de aplicación son compartidos por todas las sesiones y viven la duración completa de una aplicación ¨ n 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[“some. Var”] = some. Val; Application. Un. Lock(); 78

Global. Asax <%@ Import Namespace="System. Data" %> <%@ Import Namespace="System. Data. Sql. Client" %>

Global. Asax <%@ Import Namespace="System. Data" %> <%@ Import Namespace="System. Data. Sql. Client" %> <script language="C#" runat="server"> // global. asax methods. . . private void Application_Start(object sender, Event. Args e) { Sql. Connection con = new Sql. Connection("server=<server-name>; database=pubs; uid=sa; pwd=<password>"); string sql; Sql. Data. Adapter com; Data. Set ds = new Data. Set(); sql = "SELECT COUNT(*) from titles"; com = new Sql. Data. Adapter(sql, con); com. Fill(ds, "Num. Titles"); Application["Num. Titles"] = ds. Tables["Num. Titles"]. Rows[0][0]; } </script> 79

dump. Titles. aspx I <!-- dumptitles. aspx --> <%@ Page Language="C#" Debug="true"%> <script runat="server">

dump. Titles. aspx I <!-- dumptitles. aspx --> <%@ Page Language="C#" Debug="true"%> <script runat="server"> private void dump. Titles() { string s = "Num Titles: " + Application["Num. Titles"] + "<br/>"; Response. Write(s); } </script> <html><head><title>Application State</title></head> <body> <h 1>Application State</h 1> <% dump. Titles(); %> </body> </html> 80

dump. Titles. aspx II 81

dump. Titles. aspx II 81

Gestionando la Sesión I n n Session es una propiedad pública de System. Web.

Gestionando la Sesión I n n Session es una propiedad pública de System. Web. UI. Page y System. Web. Services. Web. Service Guardamos y recuperamos estado de sesión como sigue: int num. Requests = (int)Session[“num. Requests”]; . . . Session[“num. Requests”] = ++num. Requests; n Una sesión comienza cuando un usuario visita la aplicación y acaba cuando la sesión expira 82

Gestionando la Sesión II n <configuration> <system. web> <session. State mode=“In. Proc” cookieless=“true” timeout=“

Gestionando la Sesión II n <configuration> <system. web> <session. State mode=“In. Proc” cookieless=“true” timeout=“ 20” state. Connection. String=“…” sql. Connection. String=“…”/> </system. web> </configuration> El significado de estos atributos es el siguiente: ¨ ¨ ¨ mode Off para no permitir sesiones, In. Proc para guardar la información de sesión en el mismo proceso, State. Server remotamente o Sql. Server 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 state. Connection. String por ejemplo: 127. 0. 0. 1: 42424 sql. Connection. String el string de conexión de SQL Server 83

Ejemplo Redirect y Session n Login. aspx: void Page Load(object sender, Event. Args e)

Ejemplo Redirect y Session n Login. aspx: void Page Load(object sender, Event. Args e) { if (Is. Post. Back) { Session[“Nombre”] = Nombre. Text; Session[“Dirección”] = Direccion. Text; Response. Redirect(“Confirmation. aspx”); } } n Confirmation. aspx void Page Load(object sender, Event. Args e) { Response. Write(“Activar subscripción ” + Session[“Nombre”]); } 84

Usando Visual Studio 2005 n n Vamos a crear una aplicación web que codifica

Usando Visual Studio 2005 n n Vamos a crear una aplicación web que codifica strings a Base 64 Lanza Visual Studio. NET y selecciona File|New|Project … Visual C# Projects ASP. NET Web Application ¨ n Llama a la aplicación BAse 64 App Automáticamente se crea un Directorio Virtual y se colocarán los ficheros en c: Inet. PubwwwrootBase 64 App 85

Usando Visual Studio 2005 n n Visual Studio. NET separa el formulario web y

Usando Visual Studio 2005 n n Visual Studio. NET separa el formulario web y el código detrás del formulario Lo hace a través del atributo Code. Behind: <%@ Page language="c#" Codebehind="Web. Form 1. aspx. cs" Auto. Event. Wireup="false" Inherits="Base 64 App. Web. Form 1" %> n n Usamos la Tool. Box para generar un formulario como el que aparece en la siguiente figura Crea un fichero de configuración especial denominado Web. config 86

Usando Visual Studio. NET III 87

Usando Visual Studio. NET III 87

Usando Visual Studio. NET IV private void Encode. Button_Click(object sender, System. Event. Args e)

Usando Visual Studio. NET IV private void Encode. Button_Click(object sender, System. Event. Args e) { if (base 64 Text. Box. Text == "") { this. Encoded. Label. Text = ""; } else { System. Text. ASCIIEncoding ascii = new System. Text. ASCIIEncoding(); byte[] b = ascii. Get. Bytes((string)base 64 Text. Box. Text); this. Encoded. Label. Text = "ENCODED: " + Convert. To. Base 64 String(b); } } private void Decode. Button_Click(object sender, System. Event. Args e) { if (base 64 Text. Box. Text == "") { this. Decoded. Label. Text = ""; } else { byte[] b = Convert. From. Base 64 String(base 64 Text. Box. Text); System. Text. ASCIIEncoding ascii = new System. Text. ASCIIEncoding(); this. Decoded. Label. Text = "DECODED: " + ascii. Get. String(b); } } 88

Usando Visual Studio. NET V 89

Usando Visual Studio. NET V 89

Creando Manualmente Formularios con Code Behind I <!-- behindform. aspx --> <%@ Page Language="C#"

Creando Manualmente Formularios con Code Behind I <!-- behindform. aspx --> <%@ Page Language="C#" Inherits="Behind. Form" Src="behindform. cs" %> <html><head><title>Hello Web Form</title></head> <body> <h 1>Hello Web Form (Code-Behind Version)</h 1> <form action='behindform. aspx' method='POST' runat='server'> <asp: label text="What's Your First Name? " runat="server"/> <asp: textbox id="first. Name. Text. Box" runat="server"/> <asp: button id="greet. Button" text="Greet" On. Click="greet. Handler" runat="server"/> <p> <asp: label id="greeting. Label" runat="server"/> </p> </form> </body> </html> 90

Creando Manualmente Formularios con Code Behind II // file : behindform. cs using System;

Creando Manualmente Formularios con Code Behind II // file : behindform. cs using System; using System. Web. UI. Web. Controls; public class Behind. Form : Page { protected Text. Box first. Name. Text. Box; protected Label greeting. Label; // greet the user. . . protected void greet. Handler(object sender, Event. Args e) { first. Name. Text. Box. Text = first. Name. Text. Box. Text. Trim(); if (first. Name. Text. Box. Text == "") { // no name, so no greeting. . . greeting. Label. Text = ""; } else { // greet the user. . . greeting. Label. Text = "Hello, " + first. Name. Text. Box. Text + "!"; } } } 91

Creando Manualmente Formularios con Code Behind III 92

Creando Manualmente Formularios con Code Behind III 92

Creando gráficos “on-the-fly” <%@ Page Language="C#" %> <%@ Import Namespace="System. Drawing. Imaging" %> <script

Creando gráficos “on-the-fly” <%@ Page Language="C#" %> <%@ Import Namespace="System. Drawing. Imaging" %> <script runat="server"> void Page_Load(object sender, Event. Args e) { // Creamos el bitmap y obtenemos el objeto Graphics asociado Bitmap Grafico = new Bitmap(400, 200, Pixel. Format 32 bpp. Rgb); Graphics Superficie = Graphics. From. Image(Grafico); // Dibujamos un rectángulo, un óvalo y un texto sobre él Superficie. Fill. Rectangle(Brushes. Red, Superficie. Clip. Bounds); Superficie. Fill. Ellipse(Brushes. Blue, 10, 380, 180); Superficie. Draw. String("Distributed. NET", new Font("Courier New", 18, Font. Style. Italic|Font. Style. Bold), Brushes. White, 20, 80); // Lo pasamos como respuesta Grafico. Save(Response. Output. Stream, Image. Format. Jpeg); } </script> 93

Creando gráficos “on-the-fly” 94

Creando gráficos “on-the-fly” 94

Ejemplo ASP. NET con ADO. NET(Access) // examplesADOAccess. ASPX public class Web. Form 1

Ejemplo ASP. NET con ADO. NET(Access) // examplesADOAccess. ASPX public class Web. Form 1 : System. Web. UI. Page { private void Page_Load(object sender, System. Event. Args e) { Ole. Db. Connection conexion = new Ole. Db. Connection("Provider=Microsoft. Jet. OLEDB. 4. 0; "+"Data Source=F: \Deusto\Distributed. NET\examples\ado. net\pubs. mdb"); Ole. Db. Command comando = new Ole. Db. Command("SELECT * FROM TITLES", conexion); Ole. Db. Data. Adapter adaptador = new Ole. Db. Data. Adapter(comando); Data. Set conjunto = new Data. Set(); adaptador. Fill(conjunto, "Publicaciones"); Response. Write("Hay " + conjunto. Tables["Publicaciones"]. Rows. Count + " filas<br/>"); foreach (Data. Row fila in conjunto. Tables["Publicaciones"]. Rows) { Response. Write(fila["title_id"] + " - " + fila["title"] + "<br/>"); } } } 95

Componentes ASP específicos de Datos n Cualquier control puede tomar valores de un BBDD

Componentes ASP específicos de Datos n Cualquier control puede tomar valores de un BBDD mediante la expresión: <asp: control propiedad='<%# expresion %>'> <asp: control> n n Otros controles más sofisticados tienen la propiedad Data. Bindings Vamos a extender el ejemplo anterior para rellenar una Label con valores de una BBDD ¨ ¨ Es necesario invocar al método Data. Bind() de Page Colocar un Label con la ayuda de Visual Studio. NET y asociar a la propiedad Data. Bindings, la expresión: l Conjunto. Tables["Publicaciones"]. Rows[0]. ["Titulo"] 96

Listas, cuadrículas y plantillas n Vamos a ver como asociar fuentes de datos a

Listas, cuadrículas y plantillas n Vamos a ver como asociar fuentes de datos a controles con capacidad para visualizar múltiples filas: ¨ ¨ ¨ n n A través de las propiedades Data. Source y Data. Member podemos asociar una tabla o vista List. Box, Drop. Down. List y Check. Box. List asocian los valores de una misma columna en distintas filas ¨ n List. Box Drop. Down. List Check. Box. List Data. Grid Repeater Data. List Tienen las propiedades Data. Text. Field y Data. Value. Field Repeater y Data. List se basan en la repetición de plantillas de elementos ¨ <Item. Template><%# Data. Binder. Eval(Container. Data. Item, "Title") %></Item. Template> 97

Paginación n Los controles Repeater y Data. List no ofrecen paginación de serie ¨

Paginación n Los controles Repeater y Data. List no ofrecen paginación de serie ¨ n Se debe implementar bien manualmente o a través del componente Paged. Data. Source El control Data. Grid se apoya en Paged. Data. Source para automatizar la paginación Dando True a Allow. Paging activamos la paginación ¨ Debemos gestionar el evento Page. Index. Changed, donde asociaremos el Data. Grid al origen de datos ¨ 98

Seguridad en ASP. NET n Intervienen 3 níveles: ¨ La comunicación entre un navegador

Seguridad en ASP. NET n 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 l ¨ El segundo escalón de seguridad es el impuesto por ASP. NET l ¨ El primer nivel de seguridad radica en el filtrado de peticiones que se puede efectuar por el IIS La información de seguridad global y local se guarda en los ficheros Web. config El tercer nivel de seguridad viene dado por NTFS 99

Configuración de IIS n Con la ayuda del inetmgr podemos configurar: ¨ ¨ n

Configuración de IIS n Con la ayuda del inetmgr podemos configurar: ¨ ¨ n n Normalmente tendremos marcada la opción “Acceso anónimo” Si queremos identificar individualmente a un usuario usaríamos desactivaríamos el acceso anónimo ¨ ¨ n Un sitio web completo Carpeta virtual asociada a una aplicación Una de sus subcarpetas Archivo individual 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 100

Configuración de IIS 101

Configuración de IIS 101

Seguridad y NTFS n n n Una vez que IIS haya identificado adecuadamente al

Seguridad y NTFS n n n 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. 102

El Archivo de Configuración Web. config n n n Para una app de uso

El Archivo de Configuración Web. config n n n 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 103

Configuración de Seguridad en Machine. config n n En mi sistema este fichero se

Configuración de Seguridad en Machine. config n n En mi sistema este fichero se encuentra en: C: WINDOWSMicrosoft. NETFrameworkv 1. 1. 4322CONFIG 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" login. Url="login. aspx" protection="All" timeout="30" path="/" require. SSL="false" sliding. Expiration="true"> <credentials password. Format="SHA 1"> </credentials> </forms> <passport redirect. Url="internal"/> </authentication> <identity impersonate="false" user. Name="" password=""/> <authorization> <allow users="*"/> </authorization> 104

Métodos de Identificación n El elemento authentication establece el método de identificación que usará

Métodos de Identificación 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 ¨ 105

Autorización de Acceso n n n Se configura a través del elemento authorization Por

Autorización de Acceso n n n 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 ¨ 106

Representación del Usuario n Los atributos del elemento identity determinarán qué personalidad de qué

Representación del Usuario n Los atributos del elemento identity determinarán qué personalidad de qué usuario deberá tomar ASP. NET: indica si ASP. NET (true) debe o NO (false) debe representar al usuario ¨ user. Name: el nombre de la cuenta a usar ¨ password: la contraseña del user. Name ¨ impersonate: 107

La interfaz IPrincipal n n n Cuando se produce la identificación de un usuario,

La interfaz IPrincipal n n n Cuando se produce la identificación de un usuario, ASP. NET crea un objeto que implementa Iprincipal Windows. Principal y Generic. Principal son dos implementaciones de esta interfaz La interfaz IPrincipal expone dos miembros: ¨ ¨ Identity Is. In. Role 108

Ejemplo Security. Example n n n Revisarlo en examples/Security. Example Este ejemplo presenta al

Ejemplo Security. Example n n n Revisarlo en examples/Security. Example 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 password. Format podría tener el formato MD 5 y SHA 1 ¨ Podríamos obtener sus valores a Forms. Authentication. Password. For. Storing. In. Config. Fil e() ¨ 109

Seguridad en ASP. NET n http: //msdn. microsoft. com/library/default. asp? url=/ library/en-us/dnnetsec/html/secnetlpmsdn. asp 110

Seguridad en ASP. NET n http: //msdn. microsoft. com/library/default. asp? url=/ library/en-us/dnnetsec/html/secnetlpmsdn. asp 110

ASP. NET 2. 0 n Las novedades que proporciona son: ¨ Productividad del desarrollador

ASP. NET 2. 0 n Las novedades que proporciona son: ¨ Productividad del desarrollador l l ¨ Gestión y Administración l l ¨ Precompilación de páginas Mejor tolerancia a fallos Rapidez y Rendimiento l ¨ Nuevo controles Implementan patrones de uso comunes Mejores técnicas de caching Para más detalles: http: //www. asp. net/whidbey/whitepapers/Asp. Net. Overview. aspx? ta bindex=0&tabid=1 111

AJAX y ASP. NET n Revisar concepto AJAX 112

AJAX y ASP. NET n Revisar concepto AJAX 112

Novedades ASP. NET 2. 0 n Novedades en todas aquellas áreas comunes en toda

Novedades ASP. NET 2. 0 n Novedades en todas aquellas áreas comunes en toda aplicación web: ¨ Productividad l Nuevos controles ¨ Flexibilidad y extensibilidad ¨ Rendimiento ¨ Securidad 113

Novedades ASP. NET 2. 0 n Objetivos: Incrementar la productividad ¨ Eliminar la complejidad

Novedades ASP. NET 2. 0 n Objetivos: Incrementar la productividad ¨ Eliminar la complejidad ¨ Permitir que la construcción de páginas web sea mucho más sencilla ¨ n Mejoras: Trabajando con datos ¨ Diseño de páginas consistente ¨ Seguridad y Personalización ¨ Nuevos controles ¨ 114

Trabajando con Datos n n Nuevos controles de acceso a datos como Sql. Data.

Trabajando con Datos n n Nuevos controles de acceso a datos como Sql. Data. Source Nuevos controles web para visualizar datos: Grid. View, Details. View, Form. View ¨ n Soportan ordenación y paginado Ejemplo sencillo que permite visualizar los datos de una BBDD en una tabla: <asp: Sql. Data. Source id="ds 1" runat="server" Connection. String="Server=. ; Database=Northwind; Trusted_Connection=True" Select. Command="SELECT Company. Name, Address, City, Postal. Code, Country FROM Customers WHERE Country LIKE ' Brazil'" /> <asp: Grid. View id="grid 1" runat="server" Data. Source. ID="ds 1" /> 115

Diseño de Páginas Consistente n Páginas maestras: ¨ Permiten crear el formato de todas

Diseño de Páginas Consistente n 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 l l El webcontrol Content. Place. Holder define una región de la página maestra que puede substituirse contenido de la página asociada En la página que usa el Maestro poner <%@ Page Master. Page. File="Site. master" %> l ¨ n n n Incluye cabeceras, imágenes menús y otro contenido que luego se puede cambiar para modificar la apariencia de todo un portal Controles: ¨ ¨ n Dentro de la página usar elementos asp: Content Controles Menu y Tree. View para proveer un menú visible en la página Site. Map. Path, indica la posición de la página actual entre la jerarquía de páginas Otros controles: Site. Map. Data. Source e Image. Map Otros aspectos: temas, soporte para accesibilidad e internacionalización Ejemplo: Grid. View. Master. Details. Insert. aspx 116

Seguridad e Internacionalización n n n Control Login que visualiza el nombre de usuario

Seguridad e Internacionalización n n n Control Login que visualiza el nombre de usuario y contraseña Controles Login. Name y Login. Status visualizan el nombre y estado del usuario actual Control Password. Recovery visualiza un Asistente para recuperar la password de un usuario Usa plantillas con el control Login. View para visualizar información dependiendo del estado del usario Soporte para la personalización Web. Parts permiten crear bloques de UI reutilizables 117

Nuevos Controles n Tales como: ¨ Html. Head, Html. Title, Html. Link, Html. Password,

Nuevos Controles n Tales como: ¨ Html. Head, Html. Title, Html. Link, Html. Password, Html. Input. Reset y Html. Input. Submit ¨ File. Upload ¨ Bulleted. List ¨ Hidden. Field ¨ Multi. View y View permiten hacer que partes de una página se muestren o desaparezcan 118

Control Grid. View n El control Grid. View es un control de asociación de

Control Grid. View n El control Grid. View 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 ¨ Grid. View es un reemplazo del control Data. Grid de ASP. NET 1. x ¨ n 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 Grid. View para cambiar sus propiedades y eventos Nuevos tipos de columnas como Check. Box. Field e Image. Field. 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 119

Strings de Conexión n Sql. Data. Source referencia un string de conexión a base

Strings de Conexión n Sql. Data. Source 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 <connection. Strings>, por lo que es fácilmente mantenido para todas las páginas en una aplicación ¨ Ejemplo: <configuration> <connection. Strings> <add name="Pubs" connection. String="Server=(local); Integrated Security=True; Database=pubs; " provider. Name="System. Data. Sql. Client" /> </connection. Strings> </configuration> ¨ n 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 120

Ordenación y Paginado n El control Sql. Data. Source permite ordenación cuando: ¨ n

Ordenación y Paginado n El control Sql. Data. Source permite ordenación cuando: ¨ n Su propiedad Data. Source. Mode está asociada a Data. Set En un Grid. View: Para ordenación hay que poner su propiedad Allow. Sorting a true. ¨ Para paginado Allow. Paging a true. ¨ l n Se pueden personalizar los estilos y configuración del paginado mediante Pager. Style y Pager. Settings. Ejemplos: Grid. View. XXX. aspx 121

Aplicando Estilos, Temas y Pieles n Estilos en controles <input type="radio" name="Mode" style="width: 50;

Aplicando Estilos, Temas y Pieles n Estilos en controles <input type="radio" name="Mode" style="width: 50; backgroundcolor: red; zoom: 200%" runat="server"/>Option 2 n 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 ¨ l n Los cambios de estilo pueden simplificarse por centralizarse en un único fichero. Ejemplo: Styled. Calendar. aspx ¨ <%@ Page Language="C#" Theme="Example. Theme" %> 122

Beneficios de los Temas n Beneficios: ¨ ¨ ¨ n n Un fichero de

Beneficios de los Temas n Beneficios: ¨ ¨ ¨ n n 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: ¨ n n 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 <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: Themed. ASP_Pages. aspx 123

Controles Web. Part n Permiten añadir contenido personalizado, de formato y rico, manipulable desde

Controles Web. Part n Permiten añadir contenido personalizado, de formato y rico, manipulable desde tu página, a tu portal Web Part Controls ¨ n n n 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: Web. Part. Page. Menu. ascx y Web. Part. aspx 124

Otros aspectos n n El directorio App_Code permite compartir código entre varias páginas Redirigiendo

Otros aspectos n n El directorio App_Code permite compartir código entre varias páginas Redirigiendo a otra página: Response. Redirect("Controls_Navigation. Target_cs. aspx? name=" + System. Web. Http. Utility. Url. Encode(Name. Text)); n n Site. Map. Path, menús y treeviews Creating the Application Services Database for SQL Server ¨ aspnet_regsql. exe -E -S localhostSQLExpress -A mr 125

Referencias n New features for web developers in ASP. NET 2. 0 ¨ http:

Referencias n New features for web developers in ASP. NET 2. 0 ¨ http: //dnjonline. com/article. aspx? ID=dot. NET 2_webapps n ASP. NET 2. 0 Quick. Start Tutorial ¨ http: //quickstarts. asp. net/Quick. Startv 20/aspnet/ n Internacionalización en ASP. NET ¨ http: //www. c- sharpcorner. com/Upload. File/mosessaur/aspnetlocalizat ion 02042006165851 PM/aspnetlocalization. aspx? Article ID=96602 e 53 -0 fb 1 -44 ec-a 67 b-1 c 68 b 05 eb 2 e 1 126