cliente ligero en net tema 4 asp net http paginaspersonales deusto es dipina masterisw l.
Download
Skip this Video
Loading SlideShow in 5 Seconds..
Cliente Ligero en .NET Tema 4 – ASP.NET paginaspersonales.deusto.es/dipina/MasterISW/ PowerPoint Presentation
Download Presentation
Cliente Ligero en .NET Tema 4 – ASP.NET paginaspersonales.deusto.es/dipina/MasterISW/

Loading in 2 Seconds...

play fullscreen
1 / 126

Cliente Ligero en .NET Tema 4 – ASP.NET paginaspersonales.deusto.es/dipina/MasterISW/ - PowerPoint PPT Presentation


  • 309 Views
  • Uploaded on

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)

loader
I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.
capcha
Download Presentation

PowerPoint Slideshow about 'Cliente Ligero en .NET Tema 4 – ASP.NET paginaspersonales.deusto.es/dipina/MasterISW/' - benjamin


An Image/Link below is provided (as is) to download presentation

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript
cliente ligero en net tema 4 asp net http paginaspersonales deusto es dipina masterisw

Cliente Ligero en .NETTema 4 – ASP.NEThttp://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)

asp net
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
ejemplo html simple html
Ejemplo HTML: simple.html

<html>

<body>

Hola mundo

</body>

</html>

ejemplo petici n http
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: "50b0d3ee955cc11:a78"

User-Agent: Mozilla/4.0.(compatible; MSIE.6.0; Windows NT 5.1)

Host: www.wintellect.com

Connection: Keep-Alive

[blank line]

ejemplo respuesta http
Ejemplo Respuesta HTTP

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: "d02acf81975cc11:a78"

Content-Length: 46

[blank line]

<html>

<body>

Hola mundo

</body>

</html>

asp net vs asp
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 ‘%>’
ejemplo asp
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 = s

end 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>

asp net8
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
ejemplo asp net
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>

la clase system web ui page
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
usando page request y page response i
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>

recuperando datos de formularios con request
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
formulario asp net
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.
ciclo de vida del objeto page
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
manejando eventos de p gina
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>

creando un directorio virtual i
Creando un Directorio Virtual I
  • Creamos el directorio virtual ejemplosASP.NET:
    • Hacemos doble click en Herramientas Administrativas
    • Doble click en Internet Information Services
creando un directorio virtual ii
Creando un Directorio Virtual II
  • Creamos el directorio virtual ejemplosASP.NET:
    • 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 ‘ejemplosASP.NET’
web forms y server controls
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
ejemplo web form i
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>

ejemplo web form ii
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>

ejemplo web form iii
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
ejemplo web form v
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);

}

codificaci n base 64
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
system web ui webcontrols y system web ui htmlcontrols
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
system web ui webcontrols y system web ui htmlcontrols27
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>
propiedades interesantes de los webcontrols
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
mantenimiento de estado en controles
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
usando el control calendar
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>

usando el control datagrid i
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>

usando el control datagrid ii
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>

usando el control datagrid iii
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
usando datagrid iv
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=/library/en-us/vbcon/html/vbtskaddinghyperlinkcolumnstodatagridwebcontrol.asp
usando datagrid v
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>

usando el control htmltable i
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>

usando el control htmltable ii
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>

usando el control htmltable i40
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
controles de usuario
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
creaci n de pagelets
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" %>

creaci n de pagelets43
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
pagelets con propiedades
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>

pagelets con propiedades45
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
creando controles web de usuario con pagelets
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>
usercolor ascx i
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>

usercolor ascx ii
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>

usercolor ascx iii
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"/>

colorform aspx i
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>

custom controls
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
custom control cabecera de nuevo
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
creando un control compuesto con c digo
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()
creando un control compuesto con c digo55
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();

}

}

validando la entrada de datos
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
validando la entrada de datos57
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
validando la edad i
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>

validando la edad ii
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>

validando la edad iii
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.
validaciones complejas
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
validaciones complejas62
Validaciones Complejas

<script>

//Función de validación a medida

function VerificaMeses(source, arguments)

{

if (arguments.Value >= 6 &&

arguments.Value <=24 &&

arguments.Value%6 == 0)

arguments.IsValid = true;

else

arguments.IsValid = false;

}

configurando y customizando las aplicaciones asp net i
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
configurando y customizando las aplicaciones asp net ii
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
creando un m dulo http propietario i
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>

creando un m dulo http propietario ii
Creando un Módulo HTTP Propietario II

// file : custhttpmodules.cs

// compile : csc /t:library custhttpmodules.cs

using 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;

}

}

}

}

creando un m dulo http propietario iii
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>

creando un manejador http i
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>

creando un manejador http ii
Creando un Manejador HTTP II

// file : custhttphandlers.cs

// compile : csc /t:library custhttphandlers.cs

using System.Web;

namespace CustomHttpHandlers {

public class HelloHandler : IHttpHandler {

public void ProcessRequest(HttpContext hc) {

hc.Response.Write("Hello, World!");

}

public bool IsReusable {

get {

return true;

}

}

}

}

haciendo debugging de aplicaciones asp net
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
tracing a nivel de p gina i
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>

tracing a nivel de p gina ii
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>

tracing a nivel de aplicaci n i
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)
objetos principales de una aplicaci n asp net
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)
estado de aplicaci n en global asax
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();

global asax
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>

dumptitles aspx i
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>

gestionando la sesi n i
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
gestionando la sesi n ii
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
ejemplo redirect y session
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.aspx

void Page Load(object sender, EventArgs e) {

Response.Write(“Activar subscripción ” + Session[“Nombre”]);

}

usando visual studio 2005
Usando Visual Studio 2005
  • 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 200586
Usando Visual Studio 2005
  • 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 net iv
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);

}

}

creando manualmente formularios con code behind i
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>

creando manualmente formularios con code behind ii
Creando Manualmente Formularios con Code Behind II

// file : behindform.cs

using 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 + "!";

}

}

}

creando gr ficos on the fly
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 asociado

Bitmap Grafico = new Bitmap(400, 200, PixelFormat.Format32bppRgb);

Graphics Superficie = Graphics.FromImage(Grafico);

// Dibujamos un rectángulo, un óvalo y un texto sobre él

Superficie.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 respuesta

Grafico.Save(Response.OutputStream, ImageFormat.Jpeg);

}

</script>

ejemplo asp net con ado net access
Ejemplo ASP.NET con ADO.NET(Access)

// examples\ADOAccessASPX

public 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/>");

}

}

}

componentes asp espec ficos de datos
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"]
listas cuadr culas y plantillas
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>
paginaci n
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
seguridad en asp net
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
configuraci n de iis
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
seguridad y ntfs
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.
el archivo de configuraci n web config
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
configuraci n de seguridad en machine config
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>

m todos de identificaci n
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
autorizaci n de acceso
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
representaci n del usuario
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
la interfaz iprincipal
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
ejemplo securityexample
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()
seguridad en asp net110
Seguridad en ASP.NET
  • http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetsec/html/secnetlpmsdn.asp
asp net 2 0
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
ajax y asp net
AJAX y ASP.NET
  • Revisar concepto AJAX
novedades asp net 2 0
Novedades ASP.NET 2.0
  • Novedades en todas aquellas áreas comunes en toda aplicación web:
    • Productividad
      • Nuevos controles
    • Flexibilidad y extensibilidad
    • Rendimiento
    • Securidad
novedades asp net 2 0114
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
trabajando con datos
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" />

dise o de p ginas consistente
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
seguridad e internacionalizaci n
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
nuevos controles
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
control gridview
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
strings de conexi n
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
ordenaci n y paginado
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
aplicando estilos temas y pieles
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" %>
beneficios de los temas
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
controles webpart
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
otros aspectos
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
referencias
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