Guía Completa de ASP.NET y C#
Guía Completa de ASP.NET y C#
NET C#
Material
ÍNDICE GENERAL
1. Introducción....................................................................................................................................................... 7
ÍNDICE...............................................................................................................................................................................9
OBJETIVOS.................................................................................................................................................................. 11
INTRODUCCIÓN......................................................................................................................................................... 12
1.1. ¿Qué es [Link]?................................................................................................................................................. 13
1.2. Fundamentos y características de la programación Web................................................................................... 14
1.3. Requisitos e instalación........................................................................................................................................ 18
1.4. Microsoft Visual Studio 2010................................................................................................................................ 20
1.5. Ejemplo.................................................................................................................................................................. 25
RESUMEN..................................................................................................................................................................... 29
2. Introducción a [Link]............................................................................................................................. 31
ÍNDICE............................................................................................................................................................................ 33
OBJETIVOS.................................................................................................................................................................. 35
INTRODUCCIÓN......................................................................................................................................................... 36
2.1. Introducción a .NET............................................................................................................................................... 37
2.2. Funcionamiento [Link]...................................................................................................................................... 41
2.3. Controles [Link]................................................................................................................................................. 49
2.4. Vinculaciones......................................................................................................................................................... 51
2.5. Diseño páginas Web [Link]............................................................................................................................... 54
2.6. Web forms.............................................................................................................................................................. 57
RESUMEN..................................................................................................................................................................... 85
3. Introducción a C#......................................................................................................................................... 87
ÍNDICE............................................................................................................................................................................ 89
OBJETIVOS.................................................................................................................................................................. 91
INTRODUCCIÓN......................................................................................................................................................... 92
3.1. Introducción a C#.................................................................................................................................................. 93
3.2. Elementos básicos en la POO............................................................................................................................... 94
3.3. Elementos básicos en C#..................................................................................................................................... 99
3.4. Estructuras de control......................................................................................................................................... 111
3
[Link] C#
5. [Link]........................................................................................................................................................... 203
ÍNDICE.......................................................................................................................................................................... 205
OBJETIVOS................................................................................................................................................................ 207
INTRODUCCIÓN....................................................................................................................................................... 208
5.1. Bases de datos.................................................................................................................................................... 209
5.2. [Link]............................................................................................................................................................... 210
5.3. Objetos [Link]................................................................................................................................................. 212
5.4. Trabajando con datos.......................................................................................................................................... 226
RESUMEN................................................................................................................................................................... 249
4
Material
INTRODUCCIÓN....................................................................................................................................................... 256
6.1. Controles HTML y de usuario............................................................................................................................. 257
6.2. Controles de servidor [Link]........................................................................................................................... 262
6.3. Ciclo de vida de una página [Link]................................................................................................................. 265
6.4. Tipos de controles en [Link]........................................................................................................................... 276
6.5. Code-Behind........................................................................................................................................................ 293
6.6. Ciclo de vida de una página [Link]................................................................................................................. 296
RESUMEN................................................................................................................................................................... 311
5
1 1
[Link] con C#
DIDÁCTICA
UNIDAD
1. Introducción
1: Introducción
ÍNDICE
ÍNDICE...............................................................................................................................................................................9
OBJETIVOS.................................................................................................................................................................. 11
INTRODUCCIÓN......................................................................................................................................................... 12
1.1. ¿Qué es [Link]?................................................................................................................................................. 13
1.1.1. [Link] y ASP..................................................................................................................................................... 13
1.2. Fundamentos y características de la programación Web................................................................................... 14
1.2.1. Tipos de páginas Web............................................................................................................................................ 14
1.2.2. ¿Qué es un servidor Web?..................................................................................................................................... 16
1.3. Requisitos e instalación........................................................................................................................................ 18
1.4. Microsoft Visual Studio 2010................................................................................................................................ 20
1.5. Ejemplo.................................................................................................................................................................. 25
RESUMEN..................................................................................................................................................................... 29
9
1: Introducción
OBJETIVOS
■ Conocer los fundamentos básicos Web.
11
[Link] con C#
INTRODUCCIÓN
En esta unidad vamos a realizar una breve introducción Para poder desarrollar todo el trabajo durante este
al mundo de [Link] usando el lenguaje de curso vamos a necesitar varias herramientas como el
programación C#. Para ello haremos un breve repaso .NET Framework SDK, que vienen incorporadas por
sobre algunos de los aspectos más importantes sobre defecto en las versiones más recientes de Microsoft
programación Web y veremos cómo ha evolucionado Visual Studio. En esta unidad procederemos a mostrar
ASP hasta [Link]. Desde luego estamos ante una cómo instalar la versión de Microsoft Visual Studio
de las tecnologías más potentes para el desarrollo de 2010 con SQL Server.
páginas Web dinámicas e interactivas. El aprendizaje Hoy en día, la gran mayoría de empresas en el mundo
de [Link] es una de las mejores opciones para tienen su propia página Web y mucha gente está
empezar a programar este tipo de páginas. creando la suya propia. Por eso, ésta es una de las
mejores opciones para ir aprendiendo a hacer tu
propia página Web.
12
1: Introducción
Eso sí, para el desarrollo de [Link] son necesarios tener ciertos conocimientos
y estar familiarizado con el lenguaje HTML, lo cual nos ayudará a una realización
más rápida de nuestros trabajos. HTML (HyperText Markup Language) es el lenguaje
predominante en la realización de páginas Web. Se denomina lenguaje de marcado y
su mayor característica es que se desarrolla con etiquetas para describir la estructura
y contenido de la página. Las etiquetas van entre los signos “< >”.
Gracias a este soporte se pueden crear páginas de forma más rápida y más complejas
y además con C# nos puede resultar mucho más sencillo, ya que fue desarrollado
como parte de la plataforma .NET, a diferencia de los otros lenguajes que hemos
nombrado, que han sido adaptados a las necesidades de .NET. Como venimos
diciendo, .NET nos proporciona la ayuda necesaria para poder realizar aplicaciones
de forma rápida, segura y económica. Además, hoy en día, .NET soporta más de
20 lenguajes de programación, lo que pone de manifiesto la universalización de esta
tecnología.
13
[Link] con C#
<html>
<head>
<title>Primera</title>
</head>
<body>
<h1> Mi primera página Web </h1>
</body>
</html>
14
1: Introducción
Simplemente lo que se hace es que el autor escribe un código, lo guarda como .HTML
en el servidor para luego poder solicitar desde su navegador la página escrita, la
cual es buscada por el servidor donde se ha guardado y éste la envía por la red al
navegador donde ya se puede ver la página solicitada.
15
[Link] con C#
Servidor Web
Podemos denominarlo como un pequeño elemento software que es capaz
de administrar páginas Web para poder hacerlas visibles al cliente a través
del servidor.
De esta forma, un ejemplo de lo que en realidad ocurre al solicitar una Web sería el
siguiente:
GET/[Link] HTTP/1.1
Host: [Link]
Accept-language: en
Accept-Charset: iso-8859-1
HTTP/1.1 200 OK
16
1: Introducción
Server: Microsoft-IIS/7.0
Existe una versión de HTTP denominada HTTPS que incluye un protocolo de seguridad
denominado SSL, que se utiliza normalmente en servidores orientados al correo
electrónico donde se usan datos personales.
Tanto para el usuario como para el programador las directivas mostradas arriba se
realizan de forma transparente, es decir, que no son visibles.
17
[Link] con C#
Lo más fácil para poder usar [Link] es instalarse Microsoft Visual Studio 2010.
Nosotros vamos a usar la versión Express, puesto que nos la podemos descargar de
forma gratuita desde la siguiente dirección:
[Link]
editions/visual-web-developer-express
Una vez instaladas todas las herramientas nos debería salir una ventana con los
productos y herramientas instaladas. Además, nos saldrá alguna ventana en la que
nos recomiende instalar otras herramientas de Microsoft, las cuales no nos interesan
para este curso.
18
1: Introducción
3. Iniciar con su cuenta de correo. Esa cuenta debe ser válida registrada en
Passport. En el caso de que no la tengamos habrá que crearse una nueva. Una
vez dentro de nuestra cuenta habrá que rellenar un formulario.
19
[Link] con C#
Se sabe que prácticamente todas las páginas Web están formadas por otras
páginas Web más pequeñas, es decir, es un conjunto de páginas Web. MVS nos
da la posibilidad de crear un proyecto y dentro de éste podemos ir incluyendo todas
las páginas Web que queramos. Por ejemplo, si queremos tener una página Web
con datos de los países del sudeste asiático, crearemos un proyecto que se llame
“SudesteAsiatico” y posteriormente iremos agregando elementos que se llamen
“[Link]”, “[Link]”, “[Link]”, etcétera.
Cuando abrimos MVS nos saldrá una pantalla de bienvenida con varias opciones.
Existe una opción que es “Nuevo sitio Web”, de modo que podemos acceder desde
ahí o desde el menú Archivo -> Nuevo Sitio Web.
Una vez hecho este paso nos saldrá la siguiente ventana en la que elegiremos que
queremos hacer un “Sitio Web [Link]” y muy importante es elegir el código en el
que queremos escribir nuestros programas, que en nuestro caso es C#. Es necesario
saber la ubicación de nuestra página. Como hemos dicho antes, si queremos una
que sea de países del sudeste asiático, nos tendremos que crear una carpeta donde
queramos y en la parte de abajo donde pone “Ubicación Web” escribiremos su ruta.
20
1: Introducción
En la primera pantalla que nos sale se nos ha creado como “[Link]”. Tenemos la
opción de cambiarla yéndonos al explorador de soluciones, pinchando sobre el botón
derecho de “[Link]” y dandole a “Cambiar nombre”:
21
[Link] con C#
En este punto es importante indicar que tenemos que tener una página raíz a través
de la cual debemos ir incorporando los elementos necesarios para poder construir
una página Web. Como se ha podido apreciar, Microsoft Visual Studio lo proporciona
por defecto y ésta es la página [Link]. Sería interesante mantener este nombre y
sobre este fichero se puede crear algún menú a través del cual ir creando las páginas.
Una vez llegados aquí empezamos a decidir qué páginas incluimos en nuestro
proyecto. Para ello debemos irnos al explorador de soluciones y con el botón derecho
pinchar sobre el nombre del proyecto y después darle a “Agregar Nuevo Elemento”.
22
1: Introducción
Para ver un ejemplo de cómo actuaría vamos a coger la opción Web Forms y nos
saldrá la siguiente pantalla en la que nos aparece una plantilla con los elementos
obligatorios para poder hacer un Web Form.
Es necesario reseñar que durante todos los ejemplos de este curso vamos a necesitar
siempre dos ficheros sobre los que programar. Para ello es importante explicar que
debemos tener marcada la opción “Poner código en archivo independiente”, que
como se puede apreciar en la imagen superior, aparece en la esquina inferior derecha.
En el caso de que no aparezca dicha opción no tenemos por qué preocuparnos,
puesto que por defecto es la que MVS usa.
Para realizar nuestras páginas vamos a necesitar, al menos, dos ficheros principalmente.
Uno será el [Link] y el otro será el [Link] (o el nombre que deseemos
darle, aunque lo ideal es que lo dejemos tal cual, ya que el servidor lo primero que
busca es el fichero [Link]).
23
[Link] con C#
MVS es una herramienta bastante potente y que nos puede ayudar mucho a la hora
de programar, puesto que mientras escribimos nos salen ayudas a la derecha con
los posibles elementos que podemos escribir. Por ejemplo, si escribimos una palabra
clave como runat = …, nos aparecerá un menú de ayuda en el que pondrán server
para que no tengamos que escribirla y pinchar directamente sobre ella.
Aparte de esta herramienta hay muchas más que pueden hacer las mismas funciones
que Microsoft Visual Studio como HTML Kit, Eclipse u otros programas en los que no
vamos a incidir.
24
1: Introducción
1.5. Ejemplo
Ya es el momento de poner en práctica los primeros conocimientos que hemos
adquirido. Ahora vamos a seguir paso a paso el siguiente ejemplo:
La forma que nosotros vamos a utilizar durante todo el curso es a través de Microsoft
Visual Studio. Ya hemos visto en el punto anterior cómo se crearía un proyecto y ya
solamente nos queda escribir el código. Para ello vamos a hacerlo siempre de la misma
forma. Lo primero que debemos hacer por motivos de comodidad es tener siempre
abierto el explorador de soluciones, que se encuentra en la pestaña “Ver” y según
una versión u otra podemos encontrar directamente “Ver explorador de soluciones” o
tenemos que acceder a “Otras ventanas” y marcar la que buscamos. Una vez abierto
tenemos la siguiente imagen:
Como podemos observar, en la imagen tenemos un árbol cuya raíz es nuestra página
Web y sobre ella caen las distintas páginas y ficheros de configuración. Nosotros
vamos a centrarnos en “[Link]”. Como hemos indicado, éste es el fichero
inicial y es donde vamos a escribir nuestro código en HTML y vemos también que de
este fichero nace otro fichero denominado “[Link]” que es donde vamos
a escribir todo nuestro código en C#. Así de esta manera vamos a realizar nuestro
primer ejemplo.
<html xmlns=”[Link]
25
[Link] con C#
</head>
<body>
<h1> Bienvenidos a mi primera página Web [Link]</h1>
La hora actual es:
<asp:label id = “time” runat = “server” />
</body>
</html>
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
26
1: Introducción
Para comprobar lo que hace la página le damos a actualizar o F5 y vemos que la hora
ha cambiado.
Vamos a explicar un poco el código que hemos escrito. Como podemos observar,
tenemos dos partes bien diferenciadas, una se encuentra escrita en el lenguaje
deseado, que es C# y la otra se encuentra escrita en HTML que se deben escribir entre
las etiquetas <html> y </html>. Como vemos, el cuerpo del programa son solamente
tres líneas que nos indican la hora del reloj del sistema y en el bloque HTML hacemos
una llamada al bloque [Link] para que en el código HTML aparezca la hora. En
el código HTML simplemente tenemos el código para que muestre por pantalla la
bienvenida y la hora actual.
Como podemos observar, al abrir cada uno de los dos ficheros, Microsoft Visual
Studio nos proporciona un código que es necesario y prácticamente común a todos
los ejemplos que vamos a ver a lo largo del curso. En primer lugar vemos que en el
fichero .[Link] que es donde escribimos el código en C#, apreciamos que lo primero
que aparece son una serie de directivas del tipo “using …” seguido de un parámetro.
Estos parámetros son elementos propios de [Link] y se denominan Namespaces
y son necesarios importarlos a nuestro código para poder usar estos recursos. No
todos ellos son necesarios en nuestros ejemplos, sino que va a depender de las
instrucciones que usemos y de los elementos de programación que queramos usar.
En los ficheros del tipo .aspx observamos que también se nos proporciona un código
por defecto, pero cabe comentar que en la primera instrucción se indica el lenguaje
que vamos a usar. Recordamos que [Link] soporta varios tipos de lenguaje. Sobre
esa misma instrucción también se observa que se hace referencia a nuestro fichero
“[Link]” que es donde está la otra parte de nuestra página. Es importante
hacer la llamada a ese fichero porque de lo contrario tendremos problemas a la hora
de crear nuestra página Web.
27
1: Introducción
RESUMEN
■ [Link] es la convergencia de las tecnologías ASP y .NET.
■
[Link] es una potente tecnología para el desarrollo de páginas Web de forma
dinámica e interactiva.
■
Existen páginas Web dinámicas y estáticas. Nosotros haremos hincapié en las
dinámicas.
■
Un servidor Web es un espacio de programa capaz de administrar páginas Web para
mostrarlas al cliente a través del servidor.
■
Para poder trabajar con [Link] necesitamos un servidor, el propio [Link] y .NET
Framework SDK.
■
Para hacer una página con [Link] tenemos que tener algunos conocimientos de
HTML.
■
Anteriormente, para la creación de páginas Web [Link] era necesario haber instalado
correctamente [Link] y .NET Framework SDK, pero las versiones más modernas de
Microsoft Visual Studio traen incorporados todos estos elementos.
■
Existen multitud de herramientas para la ayuda de creación de páginas Web como
Microsoft Visual Studio que pertenece a Microsoft al igual que [Link], lo que nos
proporcionará bastantes recursos que pueden sernos útiles.
29
2
[Link] con C#
2
DIDÁCTICA
UNIDAD
2. Introducción a [Link]
2: Introducción a [Link]
ÍNDICE
ÍNDICE............................................................................................................................................................................ 33
OBJETIVOS.................................................................................................................................................................. 35
INTRODUCCIÓN......................................................................................................................................................... 36
2.1. Introducción a .NET............................................................................................................................................... 37
2.1.1. MSIL................................................................................................................................................................... 38
2.1.2. CLR.................................................................................................................................................................... 39
2.1.3. .NET Framework Class Libraries.............................................................................................................................. 39
2.1.4. Los lenguajes de programación............................................................................................................................... 40
2.2. Funcionamiento [Link]...................................................................................................................................... 41
2.3. Controles [Link]................................................................................................................................................. 49
2.4. Vinculaciones......................................................................................................................................................... 51
2.5. Diseño páginas Web [Link]............................................................................................................................... 54
2.6. Web forms.............................................................................................................................................................. 57
2.6.1. Controles de formularios HTML............................................................................................................................... 60
2.6.2. Controles de formularios de servidor........................................................................................................................ 63
RESUMEN..................................................................................................................................................................... 85
33
2: Introducción a [Link]
OBJETIVOS
■ Saber cómo está compuesto el .NET Framework.
35
[Link] con C#
INTRODUCCIÓN
En esta unidad vamos a desarrollar [Link]. Como fichero poder llamarlo con una simple línea de código.
venimos hablando en la unidad anterior, [Link] Así en esta unidad veremos algunas técnicas en las
es una tecnología muy potente para la creación de que se usa esto.
páginas Web dinámicas e interactivas; por eso vamos Hoy en día, mientras navegamos por la red podemos
a hacer un repaso a la tecnología [Link] y al .NET hacer millones de cosas, pero una de las cosas que
Framework. hacemos más frecuentemente es interactuar con el
En el mundo del diseño Web es importante saber servidor a través de formularios. Un formulario es una
cuáles son los objetivos de la página que estemos conversación entre el usuario y el servidor a través del
diseñando, cómo va a ser su diseño estéticamente cual se envía y recibe información. Una búsqueda en
hablando y, por supuesto, saber de antemano Google o cuando abres tu cuenta de correo electrónico
cuáles serán los contenidos. Para poder realizar es una interacción entre servidor y usuario. En casi
esta tarea a gran escala se necesitan muchas todas las Webs podemos encontrar formularios, así
personas bien coordinadas y mucho trabajo aparte que es de vital importancia saber manejar los tipos
de muchos recursos. Para poder realizar una página de formularios que existen y cómo, cuándo y dónde
probablemente tengamos que tirar de ficheros o usarlos.
archivos externos a nuestra página, como por ejemplo Así que vamos a realizar un pequeño viaje por las
una foto o simplemente tengamos que usar una entrañas de [Link] y a aprender a programar cada
base de datos, así que en nuestro diseño tendremos vez más con [Link].
que empezar a reutilizar código, datos o ficheros. Y
como se dice habitualmente: “No reinvente la rueda,
simplemente úsela”. Esto quiere decir que no es
necesario escribir el mismo código varias veces, sino
simplemente se puede escribir una vez y desde otro
36
2: Introducción a [Link]
Podemos resumir diciendo que [Link] es una biblioteca de clases que contiene un
gran número de funciones para trabajar con él. Para ello se dispuso el .NET Framework
que permite al programador contar con una cantidad importante de recursos para el
desarrollo de cualquier tipo de aplicación. Como ya hicimos en la unidad anterior, el
.NET Framework SDK lo instalamos en el paquete [Link].
Una vez vistos estos diferentes temas, pasaremos a desgranarlos, no sin antes hacer
un breve repaso a ciertos términos y aspectos relacionados con la codificación.
37
[Link] con C#
2.1.1. MSIL
Como todos sabemos, el lenguaje de los ordenadores es el binario, es decir, se
compone por 0’s y 1’s, pero nadie en su sano juicio es capaz de recordar una cadena
de palabras traducida a binario. Vamos a hacer un repaso por los distintos tipos de
niveles de lenguajes.
Vamos a dividir los lenguajes desde el nivel más alto al más bajo. Evidentemente el
nivel de lenguajes más alto es el lenguaje natural, que es el que hablamos los humanos
y lógicamente es el más fácil de entender.
■■ Nivel 5: lenguaje de alto nivel. Para pasar al nivel 4 lo que se hace es traducir,
que en informática se conoce como compilación.
■■ Nivel 2: nivel ISA. Viene a ser el lenguaje máquina y para pasar al nivel 1 lo que
se hace es la interpretación o secuenciación de instrucciones.
Para hacernos una idea de lo complejo que es vamos a ver un ejemplo de cómo se
pasaría del nivel 5 al nivel 2.
38
2: Introducción a [Link]
POP EBP
RET
L2:
2.1.2. CLR
El Common Language Runtime es la piedra angular de la máquina virtual de .NET
de Microsoft. Su principal función es cuidar la ejecución del código que ha sido
introducido y tratar con las tareas complicadas que Windows necesita para su correcto
funcionamiento.
Aparte, el CLR usa otro compilador que es el JIT (Just-In-Time, en español, en tiempo
de ejecución) para compilar el verdadero código máquina y gracias a ello podemos ir
actualizando al minuto nuestro código.
Se usan los namespaces, que pueden ser traducidos como áreas de trabajo,
para agrupar las clases con funcionalidad parecida, por ejemplo, para los temas
relacionados con dibujos y gráficos utilizaremos la librería [Link]. Para poder
usarla tenemos que importarla y usaríamos la siguiente sentencia:
using System.nombre_de_la_libreria
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
39
[Link] con C#
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
40
2: Introducción a [Link]
Es fundamental que tengamos en cuenta que todas las páginas que vayamos a
escribir deben ser guardadas con la extensión .aspx, ya que las páginas [Link]
están identificadas con esta misma extensión. También podemos guardar páginas
con código HTML con .aspx, pero no ocurrirá nada distinto, al igual que también
podemos usar páginas con scripts y guardadas con la extensión .htm, pero no serán
interpretadas como código [Link] y probablemente en el navegador tengamos
problemas a la hora de acceder o a la hora de visualizar ciertos componentes utilizados
en la página.
Entre las etiquetas iría el código escrito en C#. Como sabemos el lenguaje original de
[Link] es Visual Basic .NET, así que tenemos que hacer la declaración anterior para
evitar errores de compilación.
Vamos a probar qué ocurriría si introducimos este código HTML y lo guardamos como
[Link] en nuestro proyecto que nos creamos en la unidad anterior y abriremos la
página creada a través del botón derecho y “Ver en el explorador”. Es obligatorio que
el nombre de nuestro fichero y el asignado a CodeFile coincidan.
<html xmlns=”[Link]
<head>
<title>Ejemplo</title>
</head>
<body>
Hola <br />
Buenas tardes <br />
41
[Link] con C#
Vamos a probar ahora qué pasaría si introdujésemos ahora código [Link] con C#.
Dicho código lo vamos a colocar en el fichero .[Link]
Recuerda que lo tienes que guardar en tu proyecto creado en el capítulo anterior con
el nombre ejemplo2. El siguiente código debe ser escrito en un fichero .[Link]
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
42
2: Introducción a [Link]
43
[Link] con C#
Finalmente, vamos a realizar una última prueba. Sin cambiar nada de lo escrito vamos
a coger el bloque que está en el fichero .[Link] y lo vamos a incluir entre dos etiquetas
<script> y a su vez vamos a incrustarlo en el código HTML. Hacemos el mismo
proceso que anteriormente.
<html>
<head>
<title>Ejemplo</title>
</head>
<body>
Hola <br />
Buenas tardes <br />
¿Cómo estás? <br />
¿Te gusta programar? <br />
¿Y con [Link]? <br />
¿A qué mola? <br />
<script language=”c#” runat=”server”>
void Page_Load()
{
[Link](“Hola, soy [Link] <br />”);
[Link](“Buenas tardes HTML. Soy [Link] <br
/>”);
[Link](“¿Cómo estás HTML. Te recuerdo que soy
[Link] <br />”);
[Link](“¿Te gusta programar con [Link]? <br
/>”);
[Link](“Con [Link] mejor que con HTML <br
/>”);
[Link](“¿A que mola [Link]? <br />”);
}
</script>
</body>
</html>
44
2: Introducción a [Link]
45
[Link] con C#
<html xmlns=”[Link]
<head>
<title>HTML vs [Link]</title>
</head>
<body>
Hola, soy HTML, ¿Tú quién eres? <br />
<% [Link] (“Hombre, ¿qué tal?, yo soy ASP.
NET <br />”); %>
HTML es mejor que [Link] <br />
<% [Link] (“No me vaciles. [Link] es mejor
que HTML <br />”); %>
HTML, HTML, HTML <br />
<% [Link] (“[Link], [Link], [Link] <br
/>”); %>
</body>
</html>
Como resultado nos debería dar la siguiente conversación entre los dos lenguajes:
No es la única manera de insertar código [Link] entre código HTML. Hay otra forma
que es por medio de llamadas al código.
Es decir, el código [Link] se escribe fuera y desde el código HTML se hace una
referencia a dicho código. Vamos a guardar en .[Link] el siguiente código:
46
2: Introducción a [Link]
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
<html xmlns=”[Link]
<head>
<title>HTML vs [Link]</title>
</head>
<body>
Hola, soy HTML, ¿Tú quién eres? <br />
<asp:Label id = “Message” runat=”server” /> <br />
HTML es mejor que [Link] <br />
HTML, HTML, HTML <br />
</body>
</html>
47
[Link] con C#
En realidad esta técnica es mucho más efectiva que la primera, primero porque la
escritura de código es mucho más fácil, sobre todo cuando tenemos mucha cantidad
de código, y luego porque es bastante más eficiente.
48
2: Introducción a [Link]
■■ @Assembly
■■ @Control
■■ @Implements
■■ @Import
■■ @Master
■■ @MasterType
■■ @OutputCache
■■ @Page
■■ @PreviousPageType
■■ @Reference
■■ @Register
□□ Todas las directivas deben ir entre <% %>. Las más importantes son las ya
vistas Page e Import. En la directiva Page definimos nuestro lenguaje a usar:
<%Page language=”c#”>. Con la directiva @Import estamos haciendo una
llamada a los namespaces que vamos a utilizar. También es posible declarar
varios namespaces, aunque no se utilicen, con la única salvedad de que
estamos consumiendo bastantes recursos en memoria y eficiencia.
□□ También es posible que dentro del código queramos escribir algún comentario.
Para ello tenemos que poner delante de la línea que queramos comentar
dos barras: //. Ahora bien, si estamos programando fuera del bloque donde
iría nuestro código en C# y queremos incluir comentarios en cualquier otra
parte del código que no queremos que sea evaluado por [Link], debemos
escribir <%- -Comentarios de una sola línea --%>.
□□ Finalmente, nos encontramos con el código HTML y con las llamadas que
hagamos al código [Link]. De hecho, para poder programar con [Link]
son necesarios algunos conocimientos HTML.
Por el otro lado en el fichero .[Link] vamos a encontrarnos varias partes bien
diferenciadas:
49
[Link] con C#
□□ Las directivas del tipo “using System…” que sirven para hacer referencias a
bibliotecas propias de [Link]. Como ya indicamos en apartados anteriores,
cada una de ellas tiene una función y las usaremos dependiendo de nuestro
cometido a la hora de programar. Son los también denominados namespaces.
□□ Posteriormente, nos encontramos con una clase dada por defecto y dentro
de ella, el método “Page_Load (object sender, EventArgs e)”, que es donde
vamos a introducir todo el código en C# que queremos que se ejecute al
cargar la página.
50
2: Introducción a [Link]
2.4. Vinculaciones
Con [Link] podemos realizar vinculaciones a ficheros o archivos externos, por
ejemplo, a una base de datos o a un documento tipo XML o PHP. Cuando hacemos
esto tenemos que hacer alguna llamada desde el código a la ruta del fichero donde
tenemos ubicado nuestra base de datos o nuestro documento .XML. Por ejemplo,
para la conexión a una base de datos se hará de la siguiente manera:
■■ Crea el código .aspx. en otra página del editor de texto y guárdalo como edificios.
aspx.
Es un código sencillo con cuatro elementos o ítems y varias características, para que
después se nos muestre en una pequeña tabla:
51
[Link] con C#
<CIUDAD>Chicago</CIUDAD>
<PAIS>Estados Unidos</PAIS>
<ALTURA>442</ALTURA>
</ITEM>
</EDIFICIOS>
Una vez guardado nuestro código XML procedemos a escribir nuestro código ASP.
NET en el fichero .[Link]:
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
<html xmlns=”[Link]
52
2: Introducción a [Link]
<head>
<title>Edificios</title>
</head>
<body>
<asp:DataGrid id = “DataGrid1” runat=”server” />
</body>
</html>
Desgranando el código [Link] vemos que en la primera línea del código HTML
definimos el lenguaje con el que queremos trabajar. En las primeras líneas del .aspx.
cs debemos importar los namespaces, que como hemos dicho anteriormente, son
bibliotecas con funciones ya definidas que nos pueden ser útiles para la realización
de nuestro proyecto. En este caso hemos definido [Link], que proporciona
el acceso a las clases [Link] que veremos más adelante. [Link], como
podemos intuir, compatibiliza Xml con nuestro código.
53
[Link] con C#
Está claro que una página Web no es solo una página a la que accedes y la ves y ya
está. Casi el 100% de las páginas a las que accedemos están compuestas de una
página principal y varios vínculos a páginas secundarias dentro de la misma. Con
[Link] se permite definir el aspecto, diseño y comportamiento que vayan a tener
las páginas secundarias de la Web. Por lo tanto, podemos decir que el primer paso
para crear una página Web es saber cuáles son los contenidos de la página principal
y cómo vamos a diseccionar la información en otras páginas secundarias.
Así de esta forma en nuestro código tendremos que indicar cuál es nuestra página
inicial. Para ello usamos la directiva @Master y, además, debemos guardar las páginas
como .master. Por lo tanto:
Ahora vamos a ver qué se hace con las páginas secundarias. Para ello creamos
tantos ficheros como páginas secundarias queramos .aspx. En todos estos ficheros
debemos incluir la siguiente directiva:
La principal ventaja que nos aporta la creación de páginas Web [Link] con una
jerarquía es que si queremos que haya cierto contenido que aparezca en varios sitios
o un diseño de letra y color, por ejemplo, no tenemos la necesidad de copiar y pegar
código tanto en la página principal como en la secundaria, sino que utilizando las
directivas anteriores y, además, haciendo uso de los controles Content podemos
visualizar el mismo contenido escribiendo una sola vez el código, reemplazando
únicamente lo que nos interese. Los controles Content son directivas que nos permiten
englobar cierta parte del código.
Así, en la página principal se puede definir uno o varios controles content nombrados
como ContentPlaceHolder para describir la sección que puede ser reemplazable.
Y en la página secundaria habría que escribir la página tal cual la queremos, pero
añadiéndole el siguiente trozo de código:
54
2: Introducción a [Link]
También existe la posibilidad de encontrar páginas anidadas, que son páginas que
hacen referencia a otras y éstas a otras y así, sucesivamente en un orden jerárquico.
Es decir, que nos encontremos una página principal con el tema País, que a su vez
tiene una referencia hacia una página secundaria Comunidad, que llama a Provincia
y ésta finalmente llama a Ciudad. Esto se puede hacer de la siguiente manera: en la
página inicial o principal se define, como hemos visto antes, qué es la página Master:
Luego en la página secundaria, que sería en este caso, Comunidad, debemos indicar
que viene desde la página principal y a su vez debemos señalar que también es la
página Master de otra página:
Un ejemplo claro de lo que puede ser una página de este tipo son aquellas que tienen
una cabecera común o una parte con anuncios a la derecha e izquierda y lo que se va
modificando según la página en la que estemos sería el contenido del centro:
55
[Link] con C#
Como vemos tenemos una zona de contenidos comunes que son la cabecera, el pie
de página y la zona de la derecha, dejando la zona principal de la página para mostrar
los diferentes contenidos según la página en la que estemos.
56
2: Introducción a [Link]
Para señalar que estamos ante un Web form utilizamos la etiqueta <form>. Esta
etiqueta puede contener varios atributos, aunque utilizaremos solo los principales,
como <form action=”direccion_url”> que define el nombre de la página
Web que va a recibir nuestro formulario o el <form method…> que a su vez tiene dos
opciones: GET y POST. Cuando usamos estas directivas lo que en realidad estamos
haciendo es enviar el formulario al servidor Web. Probemos con el siguiente ejemplo,
guardándolo como .html.
</body>
</html>
57
[Link] con C#
Aquí hemos programado un pequeño formulario a través del cual podemos escribir
nuestros datos. Si le damos al botón de aceptar, lógicamente nos saldrá un error
porque hemos puesto una dirección inexistente. También podemos observar como
en la caja de URL del navegador aparecen ciertos caracteres que el propio navegador
coloca al detectar en nuestro formulario espacios, texto o cualquier otro elemento
“extraño” para el mismo.
<html xmlns=”[Link]
<head runat=”server”>
<title>Datos Personales</title>
</head>
<body>
<form id=”form1” runat=”server”>
58
2: Introducción a [Link]
<div>
<% [Link](“Así que tú eres, “ + Request.
QueryString[“TextBox”] + [Link][“Ape1”] +
[Link][“Ape2”] + “?”);%>
<% [Link](“Y además has sido capaz de
nacer en “ + [Link][“Lugar”]);%>
</div>
</form>
</body>
</html>
using System;
using [Link];
using [Link];
59
[Link] con C#
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
■■ Área de texto: igual que el anterior pero puede usar varias líneas. Se usa la
etiqueta <textarea>.
■■ Botones de selección única: botones para elegir una única opción. Se usa la
etiqueta <input> y en type=”radio”.
■■ Lista de opciones: permite al usuario elegir una opción de una lista. Se usa la
etiqueta <select>.
60
2: Introducción a [Link]
■■ Botón normal: es un botón que sirve para confirmar una acción. Se usa la
etiqueta <input> y type=”button”.
Veamos en una página Web todos los elementos a los que hacemos referencia:
61
[Link] con C#
</body>
</html>
Luego los botones de selección única para elegir el sexo y los botones de selección
múltiple para elegir las aficiones. Finalmente, aparece una lista de selección para elegir
el rango de edad y un botón para enviar la información al servidor Web y otro para
resetear la información.
62
2: Introducción a [Link]
Así como para el color de la letra usamos la palabra forecolor, para el resto de atributos
de diseño se usan las siguientes:
63
[Link] con C#
Hay más atributos para el diseño, pero solo hemos nombrado los más básicos y
utilizados. Hemos de decir que una etiqueta puede tomar tantos atributos como
se desee, es decir, que para una etiqueta cualquiera le podemos dar un tamaño,
un color de fondo y uno de letra a la vez poniendo todas las directivas después de
<asp:label … atributos>.
Con este control podemos elegir un elemento de una lista desplegable y la forma en
que se utiliza es la siguiente:
Al igual que en la etiqueta anterior se le pueden aplicar los atributos que queramos
a esta etiqueta. Veamos un ejemplo de cómo podría trabajar DropDownList. Primero
mostramos el fichero .[Link] y posteriormente el .aspx.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
64
2: Introducción a [Link]
<html xmlns=”[Link]
<head>
<title> Lista Desplegable </title>
</head>
<body>
<asp:Label forecolor = “blue” id = “Message” runat
= “server” />
<br />
<form id = “Form1” runat = “server”>
Elija una opcion
<br />
<br />
<asp:DropDownList forecolor = “red” ID = “list1”
runat = “server”>
<asp:ListItem> Casado </asp:ListItem>
<asp:ListItem> Soltero </asp:ListItem>
<asp:ListItem> Divorciado </asp:ListItem>
<asp:ListItem> Viudo </asp:ListItem>
</asp:DropDownList>
<br />
<br />
<input type = “submit” />
</form>
</body>
</html>
65
[Link] con C#
Podemos observar cómo hay cambios respecto a HTML, ya que en éste se usaban
las etiquetas <option> y aquí usamos <asp:ListItem>.
Así de esta manera podemos poner el código de antes cambiando esta etiqueta y la
de cierre:
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
66
2: Introducción a [Link]
}
}
__________________________________________________________
<html xmlns=”[Link]
<head>
<title> Lista Desplegable </title>
</head>
<body>
<asp:Label forecolor = “blue” id = “Message” runat
= “server” />
<br />
<form id = “Form1” runat = “server”>
Elija su deporte favorito para practicar
<br />
<br />
<asp:listbox forecolor =
“red” ID = “list1” runat = “server” SelectionMode =
“Multiple”>
<asp:ListItem> Fútbol </asp:ListItem>
<asp:ListItem> Tenis </asp:ListItem>
<asp:ListItem> Baloncesto </asp:ListItem>
<asp:ListItem> Prefiero estar en el sofá </
asp:ListItem>
</asp:listbox>
<br />
<br />
<input type = “submit” />
</form>
</body>
</html>
67
[Link] con C#
Para poder seleccionar más de una opción hay que pulsar el botón CTRL.
Esta etiqueta habría que ponerla para cada una de las opciones que tengamos.
También existe una etiqueta que se llama radiobuttonlist que se usa de la siguiente
forma:
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
68
2: Introducción a [Link]
using [Link];
using [Link];
<html xmlns=”[Link]
<head>
<title> RadioButton </title>
</head>
<body>
<asp:Label forecolor = “blue” id = “Message1”
runat = “server” /> <br />
<br />
<form id = “Form1” runat = “server”>
Elija una opcion:
<br />
<br />
<asp:radiobuttonlist forecolor = “red” ID =
“radio1” runat = “server”>
<asp:ListItem id = “opcion1” runat = “server”
Value = “Soltero” />
<asp:ListItem id = “opcion2” runat = “server”
Value = “Casado” />
<asp:ListItem id = “opcion3” runat = “server”
Value = “Divorciado” />
69
[Link] con C#
En este caso ocurre lo mismo que con radiobutton, es decir, que existe la etiqueta
checkboxlist y se usa de la misma manera. El código es exactamente igual al de
radiobuttonlist, solamente cambiando la cabecera de la etiqueta y evidentemente el
cierre.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
70
2: Introducción a [Link]
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
if ([Link][0].Selected) s = s + eleccion.
Items[0].Text + “<br />”;
if ([Link][1].Selected) s = s + eleccion.
Items[1].Text + “<br />”;
if ([Link][2].Selected) s = s + eleccion.
Items[2].Text + “<br />”;
if ([Link][3].Selected) s = s + eleccion.
Items[3].Text + “<br />”;
[Link] = s;
}
}
__________________________________________________________
<html xmlns=”[Link]
<head>
<title> CheckBox </title>
</head>
<body>
<asp:Label forecolor = “blue” id = “Message1”
runat = “server” /> <br />
<br />
71
[Link] con C#
72
2: Introducción a [Link]
Hemos de tener en cuenta varias cosas. [Link] va a reconocer todas las opciones,
pero siempre va a empezar a contar a partir de 0. Así la opción 1 que nosotros
tengamos, para que sea reconocida tendremos que codificarla en la recepción de
datos con el índice 0. Como se puede observar, hay que escribir al principio del
código tantos Ítems como número de opciones tengamos para que el servidor pueda
reconocerlos todos.
Los posibles atributos que podemos usar para esta etiqueta son textmode y habría
que darle valor “multiline” si queremos que sea un área de texto y además, si queremos
designarle un número concreto de líneas, lo haremos con el atributo rows al que le
tendríamos que dar el valor que quisiéramos que tuviese (rows solo funciona, si se ha
declarado un área de texto multilínea). Si también queremos que tenga un número
concreto de columnas, habría que escribir columns, actúa como rows. Textmode
también puede tomar como valor password para que actúe como contraseña, es
decir, ocultando los caracteres por asteriscos. Veamos un ejemplo:
73
[Link] con C#
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
74
2: Introducción a [Link]
<html xmlns=”[Link]
<head>
<title> Textos </title>
</head>
<body>
<asp:Label forecolor = “blue” id = “nombre1” runat =
“server” />
<br />
<asp:Label forecolor = “blue” id = “apellidos1” runat =
“server” />
<br />
<asp:Label forecolor = “blue” id = “amigos1” runat =
“server” />
<br />
<asp:Label forecolor = “blue” id = “passwd1” runat =
“server” />
<br />
<form id = “Form1” runat = “server”>
¿Cómo se llama?
<br />
<br />
<asp:textbox ID = “nombre” runat = “server”></asp:textbox>
<br />
<br />
¿Cuáles son sus apellidos?
<br />
<br />
<asp:textbox ID = “apellidos” runat = “server”></
asp:textbox>
<br />
<br />
¿Quiénes son sus amigos?
<br />
<br />
<asp:TextBox id = “amigos” runat = “server” TextMode =
“MultiLine” Rows = “5”></asp:TextBox>
<br />
75
[Link] con C#
<br />
Dígame una contraseña. Ponla difícil
<br />
<br />
<asp:TextBox id = “passwd” runat = “server” TextMode =
“password”></asp:TextBox>
<br />
<br />
<input type = “submit” />
</form>
</body>
</html>
76
2: Introducción a [Link]
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
<html xmlns=”[Link]
<head>
<title> Control Oculto </title>
</head>
<body>
<asp:Label forecolor = “blue” id = “Message1”
77
[Link] con C#
Finalmente, vamos a ver un ejemplo donde se combinan todos los controles anteriores,
pero además usando una llamada a otro fichero para ver las respuestas.
<html xmlns=”[Link]
78
2: Introducción a [Link]
79
[Link] con C#
Descuentos aplicables:
<br />
<asp:ListBox ID = “descuentos” SelectionMode =
“Multiple” runat = “server”>
<asp:ListItem Value = “Residente Canarias” />
<asp:ListItem Value = “Jubilado” />
<asp:ListItem Value = “Familia numerosa” />
<asp:ListItem Value = “Descuentos por puntos” />
</asp:ListBox>
<br />
<br />
Observaciones: <br />
<asp:TextBox ID = “observaciones” Rows = “3” TextMode
= “MultiLine” runat = “server” />
<br />
<input type = “submit” value = “Confirmar” />
<input type = “reset” value = “Cancelar” />
</form>
</body>
</html>
80
2: Introducción a [Link]
Ahora bien, ¿qué ocurre si pulsamos el botón de confirmar? Si miramos al principio del
código tenemos la siguiente línea:
que nos indica que el servidor nos va a redireccionar a la página [Link] que la
tenemos que crear, y cuyo código será el siguiente:
<html xmlns=”[Link]
<head runat=”server”>
<title>Confirmación reserva</title>
81
[Link] con C#
</head>
<body>
<form id = “form1” runat = “server”>
<div>
<% [Link](“<b>Nombre:</b> “ + Request.
Form[“nombre”] + “<br />”);%>
<% [Link](“<b>Apellidos:</b> “ + Request.
Form[“apellidos”] + “<br />”);%>
<% [Link](“<b>Salida:</b> “ + Request.
Form[“origen”] + “<br />”);%>
<% [Link](“<b>Llegada:</b> “ + Request.
Form[“destino”] + “<br />”);%>
<% [Link](“<b>Tipo de viaje:</b> “ +
[Link][“viaje”] + “<br />”);%>
<% [Link](“<b>Descuentos:</b> “ + Request.
Form[“descuentos”] + “<br />”);%>
<% [Link](“<b>Observaciones:</b> “ +
[Link][“observaciones”] + “<br />”);%>
<br />
<input type = “submit” value = “Confirmar
definitivamente” />
<br />
Gracias por confiar en nosotros. Desde Raianair les
deseamos un feliz viaje.
</div>
</form>
</body>
</html>
Es muy importante que creemos los dos ficheros en la misma carpeta para que el
servidor no se líe. En otro caso, tendremos que poner la ruta del fichero entera o a
través de su ruta relativa de la forma /../[Link] o ~/../[Link].
Lo que ocurre al darle al botón confirmar del código anterior es que nos lleva a esta
página y nos debería mostrar una Web así:
82
2: Introducción a [Link]
Y con este ejemplo finalizamos la unidad en la que hemos aprendido a usar formularios
y el funcionamiento de [Link].
83
2: Introducción a [Link]
RESUMEN
■
El .NET Framework se compone del MSIL, CLR, .NET Framework Class Libraries y de
distintos lenguajes de programación que son soportados por dicha tecnología.
■
Dentro de un programa con código HTML y [Link] va a interpretar primero el ASP.
NET, puesto que lo que primero hace es buscar el código en C#.
■
Para leer en el orden que queramos el código e intercalar código HTML con [Link]
podemos usar ciertas directivas como [Link].
■
Cuando estemos creando una página [Link] al principio del código debemos indicar
el lenguaje en el que se va a escribir y declarar las directivas y los namespaces que nos
van a ser útiles.
■
Para realizar páginas Web probablemente tengamos que usar recursos externos a
nuestro código, por lo que necesitaremos saber dónde están los recursos y hacer la
llamada a éstos correctamente.
■
Para poder realizar páginas principales y secundarias que dependan de la principal
debemos utilizar la directiva @Master y los controles Content y ContentPlaceHolder.
■
En los formularios existen varios tipos de controles según los datos que necesitemos.
Los más importantes son las cajas de texto, las áreas de texto, campo contraseña,
botones de selección única, botones de selección múltiple, lista de opciones, botón de
confirmación, botón de reset y botón normal.
■
En [Link] tenemos muchas etiquetas, indicamos algunas de ellas: <asp:textbox>
para cajas de texto, áreas de texto y campo contraseña, <asp:checkbox> para
los botones de selección múltiple, <asp:listbox > para selección única o múltiple de
opciones de un menú desplegable, <asp: dropdownlist> para selección única
de un menú desplegable, <asp:radiobutton> para elegir una opción de entre las
posibles. Además, disponemos de un control para campos ocultos que hay que indicar
con la palabra “hidden”.
■
Los controles en HTML y [Link] son prácticamente los mismos con la salvedad
de que en [Link] tenemos interactividad con el código servidor gracias al runat =
“Server”, cosa que no se puede hacer con HTML.
85
3
[Link] con C#
3
DIDÁCTICA
UNIDAD
3. Introducción a C#
3: Introducción a C#
ÍNDICE
ÍNDICE............................................................................................................................................................................ 89
OBJETIVOS.................................................................................................................................................................. 91
INTRODUCCIÓN......................................................................................................................................................... 92
3.1. Introducción a C#.................................................................................................................................................. 93
3.2. Elementos básicos en la POO............................................................................................................................... 94
3.2.1. Objeto................................................................................................................................................................. 94
3.2.2. Interfaz................................................................................................................................................................ 94
3.2.3. Clases................................................................................................................................................................. 96
3.2.4. Herencia.............................................................................................................................................................. 98
3.2.5. Hola mundo......................................................................................................................................................... 98
3.3. Elementos básicos en C#..................................................................................................................................... 99
3.3.1. Palabras clave....................................................................................................................................................... 99
3.3.2. Tipos de datos...................................................................................................................................................... 99
3.3.3. Variables, constantes y enumerados....................................................................................................................... 104
3.3.4. Operadores........................................................................................................................................................ 106
3.4. Estructuras de control......................................................................................................................................... 111
3.4.1. Estructuras de salto............................................................................................................................................. 111
3.4.2. Estructuras de bucles........................................................................................................................................... 115
3.5. Cadenas............................................................................................................................................................... 118
3.6. Estándar de codificación de C#.......................................................................................................................... 119
3.6.1. Reglas generales................................................................................................................................................. 119
3.6.2. Regiones........................................................................................................................................................... 120
3.6.3. Declaraciones..................................................................................................................................................... 120
3.6.4. Encapsulación variable miembro–propiedades en clases........................................................................................... 121
3.6.5. Inicializaciones.................................................................................................................................................... 121
3.6.6. Sentencias......................................................................................................................................................... 121
3.6.7. Estilos de mayúsculas.......................................................................................................................................... 124
3.6.8. Distinción de mayúsculas y minúsculas................................................................................................................... 124
3.6.9. Abreviaturas....................................................................................................................................................... 125
3.6.10. Elección de palabras.......................................................................................................................................... 126
3.6.11. Evitar confusión de nombres de tipos................................................................................................................... 129
3.6.12. Instrucciones de nomenclatura de spacename....................................................................................................... 130
3.6.13. Instrucciones de nomenclatura de clases.............................................................................................................. 131
3.6.14. Instrucciones de nomenclatura de interfaces.......................................................................................................... 132
3.6.15. Instrucciones de nomenclatura de parámetros....................................................................................................... 132
3.6.16. Instrucciones de nomenclatura de métodos........................................................................................................... 133
3.6.17. Instrucciones de nomenclatura de propiedades...................................................................................................... 134
3.6.18. Instrucciones de nomenclatura de eventos............................................................................................................ 135
89
[Link] con C#
90
3: Introducción a C#
OBJETIVOS
■ Aprender conceptos básicos de C#.
91
[Link] con C#
INTRODUCCIÓN
Uno de los aspectos más importantes de la informática queremos realizar una aplicación Web, utilizaremos
son los lenguajes de programación. Podemos definir un lenguaje adecuado como HTML, XML o PHP.
un lenguaje de programación como un idioma que Si queremos hacer alguna aplicación para nuestro
habla un ordenador, de hecho, gracias a determinadas ordenador, utilizaremos JAVA o C++. Existen lenguajes
herramientas los ordenadores pueden llegar a entender orientados a objetos, para programación funcional o
casi todos los lenguajes. De esta forma una persona le para dispositivos móviles.
habla al ordenador con un lenguaje de programación El lenguaje que nosotros vamos a utilizar es C#, que
y éste lo interpreta y nos muestra el resultado de esa es un lenguaje propio de Microsoft orientado a objetos
interpretación de una forma mucho más entendible. y que tiene cierto parecido a C o C++, puesto que
Existen muchos lenguajes de programación y son predecesores suyos. Aparte de la tecnología ASP.
cada día más, porque también están apareciendo NET, C# puede ser usado para la programación de
progresivamente más dispositivos electrónicos que otros tipos de aplicaciones, así como para distintos
soportan lenguajes de programación, en algunos dispositivos móviles. De hecho, hoy en día .NET es
casos, casi exclusivos para ese dispositivo. Según el una de las tecnologías más usadas para la creación
tipo de aplicación que queramos realizar utilizaremos de aplicaciones para los distintos tipos de dispositivos
un lenguaje de programación u otro. Por ejemplo, si que nos podemos encontrar en el mercado.
92
3: Introducción a C#
3.1. Introducción a C#
C# es un lenguaje orientado a objetos, desarrollado por Microsoft para poder ser
usado para la plataforma .NET. Este lenguaje es resultado de la evolución que ha
tenido C a lo largo del tiempo. Primero fue el lenguaje C y posteriormente C++ para
que finalmente apareciera C#. En realidad C es un lenguaje que nació como evolución
del lenguaje anterior B y está orientado a la implementación de UNIX, un sistema
operativo.
Como hemos dicho C# es la evolución de C y C++, pero éste simplifica muchas de las
complejidades que tenían sus predecesores. Además, con este lenguaje se admiten
métodos y tipos genéricos que permiten mayor eficacia y rendimiento. También se
pueden utilizar los iteradores que sirven para recorrer listas de manera eficiente. Este
lenguaje, además, permite el desarrollo de aplicaciones software de manera sencilla
gracias a ciertas características.
93
[Link] con C#
3.2.1. Objeto
Un objeto es una instancia de una clase que realiza tareas de un programa en tiempo
de ejecución, puesto que tienen cierta información y capacidades necesarias para
solventar dichas tareas. Por lo tanto, podemos definir a un objeto como un ente que
tiene un comportamiento y un estado. Cuando nos referimos a estado de un objeto
estamos hablando de las propiedades que definen al objeto. Por ejemplo, supongamos
que nos referimos al registro de una persona en una base de datos. La persona dentro
de la base de datos sería un objeto y los valores de sus propiedades, tales como
nombre, apellidos, edad, NIF… conformarían lo que es el estado de la persona. Cuando
hablamos de comportamiento estamos refiriéndonos a lo que se ofrece a través de
los métodos. Estos métodos pueden ser consultores o modificadores del estado de
los objetos y sirven para comunicarse con el exterior. Por ejemplo, si tomamos el
objeto persona anterior y queremos modificar el domicilio de una persona, estaremos
utilizando algún método definido como modificador para realizar los cambios sobre el
objeto persona.
Como resumen podemos decir que un objeto es un tipo que contiene unos atributos
que definen sus características y unos métodos para acceder a sus atributos e
implementar su comportamiento.
3.2.2. Interfaz
Genéricamente hablando, una interfaz es un punto de interacción entre distintos
componentes, que sirve de anclaje para éstos y que comprende todos los campos en
común entre ellos.
94
3: Introducción a C#
using System;
using [Link];
using [Link];
using [Link];
interface ITelevisor
{
int Volumen
{
get;
set;
}
int Brillo
{
get;
set;
}
int Contraste
{
get;
set;
}
}
95
[Link] con C#
Con el método “get” se recoge el valor de cada uno de los atributos y con el “set” se
pueden modificar.
3.2.3. Clases
Gracias a las clases podemos definir el estado interno de un objeto, a través de
sus atributos, definir la forma en la que se crean los objetos mediante los métodos
constructores y calcular sus propiedades a partir de los atributos del objeto. Las
clases en C# permiten herencia (más adelante veremos su definición). Según el nivel
de acceso que le queramos imponer a las clases existen ciertos comportamientos que
debemos aplicarle a las mismas. Existen las siguientes palabras:
■■ Public: si definimos una clase como public estamos dándole apenas restricción
y cualquiera puede crear objetos a partir de esta clase.
■■ Private: es un modificador del nivel más restrictivo. Los miembros privados solo
son accesibles desde el cuerpo de la clase o desde la estructura en la que se
declaran.
■■ Protected: una clase que es protected, solo es accesible desde su clase y sus
derivadas.
■■ Internal: en una clase internal, los tipos o miembros internos solo son accesibles
dentro de los archivos del mismo ensamblado.
De esta forma estamos creando objetos de tipo Televisor con las propiedades de esa
clase.
Para el ejemplo anterior del televisor podemos seguirlo con el siguiente código:
96
3: Introducción a C#
{
vol = volumen;
bril = brillo;
cont = contraste;
}
public int Volumen
{
get
{
return vol;
}
set
{
vol = value;
}
}
public int Brillo
{
get
{
return bril;
}
set
{
bril = value;
}
}
public int Contraste
{
get
{
return cont;
}
set
{
cont = value;
}
}
}
Para poder evaluar el comportamiento que realizan los objetos deberíamos programarlo
justo antes de la última llave.
97
[Link] con C#
3.2.4. Herencia
Éste es uno de los elementos más útiles a la hora de programar. Podemos definirlo
como una propiedad padre-hijo donde todas las propiedades que tenga el padre
también las va a tener automáticamente el hijo. La principal función de la herencia
es que la clase hija pueda tomar las propiedades del padre y además, añadirle las
suyas propias para especializarse. Supongamos que tenemos una clase reproductor
de música con las características volumen, avance, retroceso, stop y play. Ésta sería
la clase padre, y la clase hija pues podría ser Walkman, Discman, MP3, MP4 o IPod.
Cada una de estas clases hijas hereda todas las características de la clase padre,
pero además cada una de ellas puede adquirir ciertos comportamientos nuevos. Por
ejemplo, tomamos la clase hija Discman y aparte de las características que tiene le
podemos añadir la característica tipo de soporte, avance rápido, retroceso rápido, etc.
Así de esta forma hemos escrito nuestro primer programa en C#. Explicando un poco
este programa vemos que se ha definido primero la clase, que como no, se llama
HolaMundo. Posteriormente se ha definido la clase principal del programa que es la
sección donde van las acciones que queremos que haga nuestro programa.
También podemos observar que se hace uso de llaves. Estas llaves sirven para delimitar
una zona de código, donde queremos que pasen ciertas cosas. Es muy importante
el uso de las llaves y tener controlado cuándo abren y cuándo cierran, porque de lo
contrario estaremos peleándonos continuamente con el código y el compilador nos
mostrará mensajes de error relacionados con una cantidad de llaves no balanceadas.
98
3: Introducción a C#
abstract, as, base, bool, break, by, byte, case, catch, char, checked, class, const,
continue, decimal, default, delegate, do, double, descending, explicit, event, extern,
else, enum, false, finally, fixed, float, for, foreach, from, goto, group, if, implicit, in, int,
interface, internal, into, is, lock, long, new, null, namespace, object, operator, out,
override, orderby, params, private, protected, public, readonly, ref, return, switch,
struct, sbyte, sealed, short, sizeof, stackalloc, static, string, select, this, throw, true,
try, typeof, uint, ulong, unchecked, unsafe, ushort, using, var, virtual, volatile, void,
while, where, yield.
Es muy importante el hecho de que existan los tipos para que la programación del
código sea clara y ordenada. De hecho, cada vez que estemos realizando cualquier
tipo de operación el compilador comprueba si se está utilizando el tipo correcto o no
para ser compiladas o en caso contrario mostrarnos un error.
■■ Tipo entero.
■■ Tipo double.
■■ Tipo booleano.
■■ Tipo char.
99
[Link] con C#
■■ Tipo string.
■■ Tipo array.
■■ Conversión de tipos.
class Coche
{
public static void Main()
{
int ruedas = 4;
int asientos = 5;
int puertas;
puertas = 3;
}
}
Existen otros tipos que se podrían englobar en los enteros, pero tienen otras
características. Los tipos byte y sbyte definen también tipos enteros, pero sólo puede
tomar valores entre 0 y 255 para byte y entre -128 y 127 para sbyte. En .NET se
definen como [Link] y [Link]. En el código se utilizarían de la misma
manera que int. Después tenemos los tipos short y ushort. Los valores que pueden
tomar son desde -32768 hasta 32767 para los short y desde 0 hasta 65535 para
ushort. En .NET vendrían dados por System.Int16 y System.UInt16 respectivamente.
Además, tenemos el tipo uint que es la versión de int, pero solo para números
positivos, pues puede tomar los valores que van desde 0 hasta 4294967295.
Finalmente, tenemos los tipos long y ulong que pueden tomar valores que van desde
-9223372036854775808 hasta 9223372036854.775807 para el caso de long y
desde 0 hasta 18446744073709551615 para ulong. Para .NET serían System.Int64
y System.Uint64.
A modo de resumen podemos decir que los tipos que van con la U delante quieren
decir que son tipos unsigned, es decir, sin signo y por eso solo toman valores positivos.
Los valores que toma cada tipo son la potencia de dos de cada uno de ellos. Por
ejemplo, sabemos que un byte son 8 bits, así que los valores que puede tomar son
hasta 2^8 -1, los que puede tomar short son como mucho 2^16 -1, y así con int y
long que pueden tomar hasta 2^32 -1 y 2^64 -1. Todos estos tipos se declaran de la
misma manera que el tipo int.
100
3: Introducción a C#
class Coche
{
public static void Main()
{
double deposito = 60.3234;
double velocidadMax;
velocidadMax = 190.275;
}
}
Además del tipo double, existen otros dos tipos muy similares que son el tipo float y
el tipo decimal, pero estos dos con mucha menos precisión que double. Para float
tendríamos en .NET lo siguiente: [Link] con valores que pueden estar entre
±1.5E-45 y ±3.4E38 aproximadamente con 7 cifras significativas y para decimal
tendríamos [Link] y con unos valores aproximados entre ±1.0E-28 y
±7.9E28 con 28 o 29 cifras significativas.
class Coche
{
public static void Main()
{
bool todoterreno = false;
bool descapotable;
descapotable = true;
}
}
Los posibles valores que pueden tomar los booleanos son true y false.
101
[Link] con C#
class Coche
{
public static void Main()
{
char tipoVehiculo = ‘A’;
}
}
class Coche
{
public static void Main()
{
string marca = “Seat”;
string modelo = “Pandita”;
string motor;
motor = “diesel”;
}
}
using System;
class Vector
{
public static void Main()
{
string[] arr = new string[4];
arr[0] = “H”;
arr[1] = “o”;
102
3: Introducción a C#
arr[2] = “l”;
arr[3] = “a”;
[Link](arr[0] + arr[1] + arr[2] + arr[3]);
}
}
Además también podemos declarar los arrays en forma de vector bidimensional. Para
ello se puede hacer de la siguiente manera:
Tenemos que tener en cuenta que en C# los ínidices empiezan en 0, así que si estamos
formando una matriz, debemos estar atentos a este detalle.
class Coche
{
public static void Main()
{
int autonomia = 600;
int deposito = 75;
double litros100km = ((double) deposito /
autonomia) * 100;
[Link](“{0}!”, litros100km);
}
}
103
[Link] con C#
Tenemos que tener mucho cuidado con las conversiones que queramos realizar, pues
no todas están disponibles. Por ejemplo, no podemos convertir ningún tipo con signo
a alguno sin signo. Un ejemplo de una conversión de tipo podría ser el siguiente:
int i;
try
{
i = [Link]([Link]);
}
catch (FormatException)
{
i = 0;
}
catch (OverflowException)
{
i = 0;
}
104
3: Introducción a C#
class Coche
{
//ZONA DE VARIABLES GLOBALES
private int capacidad;
private int autonomia;
private int velMax;
void Autopista()
{
velMax = 120;
}
void Ciudad()
{
velMax = 50;
}
}
En este ejemplo podemos ver que existen variables locales y variables globales. En
este caso solo tenemos una variable local que es “consumo” y se usa en el main, y
luego tenemos varias variables globales como capacidad, autonomía y velMax. Como
vemos, es posible declarar las variables de varias formas. Las más comunes son las
siguientes:
105
[Link] con C#
Otro de los términos que se usan son las constantes. Una constante es un atributo
que no va a cambiar de valor a lo largo de la ejecución del programa, por eso se le da
un valor al principio de éste y que va a llevar hasta el final.
Finalmente, están los enumerados. Estos tipos sirven para darle un conjunto de
valores concretos a las variables. Si por ejemplo, estamos implementando un juego
“Parchís”, lo ideal es crear un tipo enum con los valores rojo, amarillo, verde y azul.
class Parchis
{
enum turno
{
rojo,
amarillo,
verde,
azul,
}
}
}
3.3.4. Operadores
Los operadores son símbolos que llevan asignados una operación predefinida sobre
los operandos para que genere un resultado.
106
3: Introducción a C#
a = 2;
b = 3;
c = a + b;
d = c + 6;
Además, tenemos varios tipos más de asignación. Por ejemplo, si queremos usar la
misma variable expresamente para hallar otro valor, se puede hacer de las siguientes
formas:
var1 = 4;
var1 = var1 + 4;
var1 += 4;
var2 = 5;
var2 = var2 + 1;
var2++;
var3 = 5;
var3 = var3 - 3;
var3 -= 3;
var4 = 9;
var4 = var4 - 1;
var4--;
Aquí hemos visto varios ejemplos de cómo se pueden hacer las asignaciones. Por
ejemplo, en var1 se puede hacer la suma de esas dos formas y para var3 igual. Si lo
que queremos es ir sumando o restando de uno en uno, se pueden hacer de las dos
formas que aparecen para var2 y var4 respectivamente.
Además de las asignaciones para sumar y restar, existen también las asignaciones
con el operando * para multiplicar y / para dividir y se usan exactamente de la misma
manera que las anteriores, pero teniendo en cuenta que es absurdo tener un operador
var**, ya que no tiene sentido multiplicar esa variable por 1, al igual que tampoco
tendría sentido dividirla por 1. De esta forma solo tenemos para multiplicar y dividir:
var *= 10;
var /= 10;
107
[Link] con C#
using System;
class OpAritmeticos
{
public static void Main()
{
int a = 10 + 5;
int b = 10 - 5;
int c = 10 * 5;
int d = 10 / 5;
int e = 10 % 5;
int f = -10 + 5;
[Link](“ a = {0}\n b = {1}\n c = {2}\n d
= {3}\n e = {4}\n f = {5}\n”, a, b, c, d, e, f);
}
}
Es muy importante saber que si no usamos paréntesis entre las operaciones que
hagamos, tendremos que conocer cuáles son las reglas de precedencia entre los
operadores. Por norma general se sigue el siguiente orden:
■■ *, /, %
■■ +, -
int a = 1;
int b = 2;
bool comp;
comp = (a == b); //IGUAL
comp = (a != b); //DISTINTO
108
3: Introducción a C#
La primera de ellas sirve para comparar si dos elementos son iguales. No confundir con
el operador de asignación que solo lleva un símbolo = y éste lleva dos. En el segundo
caso se compara si son distintos los dos elementos y el resto de comparaciones son
claras. En todas ellas, las respuestas van a ser o bien true o bien false.
using System;
class OpLogicos
{
public static void Main()
{
int a = 1;
int b = 2;
int c = 3;
Podemos ver que para ver si se cumplen las dos condiciones usamos &&, para ver si
se cumple una u otra ||, y para ver si una condición no se cumple usaremos !. Es decir,
podemos decir que && significa Y, || significa O, y ! significa NO.
109
[Link] con C#
Además, existen otros dos operadores lógicos que son muy parecidos a los anteriores
como son & y |, con la diferencia que estos últimos hacen las comparaciones a nivel
de bits.
110
3: Introducción a C#
class Saltos
{
static void Main()
{
[Link](“De momento voy por mi línea”);
SaltoIncondicional();
[Link](“Vuelvo del salto
incondicional”);
}
111
[Link] con C#
if (condicion)
{
//Ejecución de las instrucciones si se cumplen
}
else
{
//Ejecución de las instrucciones si no se
cumplen
}
using System;
class SaltoCondicional
{
public static void Main()
{
double numero;
if (numero < 5)
{
[Link](“SUSPENSO. Tienes que
mejorar”);
}
else if (numero >= 5 && numero < 7)
{
[Link](“APROBADO. Bueno, todavía se
puede mejorar más”);
}
112
3: Introducción a C#
En C# está permitida la anidación de bucles if. Esto quiere decir que si se cumple una
condición se entra en la ejecución y una vez aquí es posible que nos encontremos otra
instrucción if para que cumpla otra condición.
113
[Link] con C#
También existe otra instrucción muy similar al else-if que es el switch. Con esta
instrucción se ejecuta solo la parte que nos interese. Se utiliza la palabra reservada
switch para leer lo que se escribe y luego las palabras case y break. Con case se
evalúa la opción y si coincide con la elegida pues se entra y cuando se ejecuten las
instrucciones necesarias se saldrá con break y no se ejecutará ninguna opción más.
Si no coincide con ninguna de las opciones, se usa la palabra reservada default, se
ejecutan sus instrucciones y se sale. Un ejemplo de uso de este tipo de estructuras
podría ser el que vemos a continuación:
using System;
class InstruccionSwitch
{
public static void Main()
{
string s;
s = [Link]();
switch (s)
{
case “+”:
[Link](“El resultado de sumar 10
y 20 es {0}”, 10 + 20);
break;
case “-”:
[Link](“El resultado de restar 10
y 20 es {0}”, 10 - 20);
break;
case “*”:
[Link](“El resultado de
multiplicar 10 y 20 es {0}”, 10 * 20);
break;
case “/”:
[Link](“El resultado de dividir 20
entre 10 es {0}”, 20 / 10);
break;
default:
[Link](“No te entiendo”);
break;
}
}
}
114
3: Introducción a C#
Esto quiere decir que el bucle for toma un valor de inicio, la expresión nos indica hasta
dónde se debe ejecutar empezando a contar desde el valor de inicio y, el iterador nos
indica qué es lo que se debe hacer después de ejecutar cada paso del bucle.
using System;
class BucleFor
{
public static void Main()
{
for (int cont = 0; cont < 10; cont++)
{
[Link](“Esta es la línea número {0}”,
cont);
}
}
}
Aquí se ha podido ver otra forma de declarar una variable. En el bucle for, al inicializar
debemos también declararla. Además, otra opción es la posibilidad de anidación de
bucles for.
115
[Link] con C#
class BucleWhile
{
public static void Main()
{
int cont = 1;
while (cont < 5)
{
[Link](“Esta es la línea número {0}”,
cont);
cont = cont + 1;
}
}
}
En este caso la instrucción while se va a ejecutar siempre que el contador sea menor
que 5. En el momento en el que el contador sea mayor ya no se entra más en el bucle.
Es importante saber que se debe poner alguna acción para que se realice dentro del
bucle y para que se vaya modificando el contador porque de lo contrario entraremos
en un bucle infinito y el programa nos dará un error.
class DoWhile
{
public static void Main()
{
int cont = 0;
do
{
[Link](“Esta es la línea {0}”, cont);
cont++;
}
while (cont != 5);
}
}
116
3: Introducción a C#
class ContinueBreak
{
public static void Main()
{
for (int cont = 0; cont < 10; cont++)
{
if (cont == 2)
continue;
if (cont == 4)
continue;
if (cont == 6)
continue;
if (cont == 9)
break;
[Link](“Se está ejecutando{0} \n”,
cont);
}
}
}
117
[Link] con C#
3.5. Cadenas
Las cadenas no son más que el texto que queremos que se muestre. Como se ha
podido observar, hemos estado utilizando continuamente la siguiente sentencia:
“[Link] (“Texto a mostrar”)”. En realidad ésta es la instrucción que se
debe ejecutar cada vez que queramos que en nuestro programa aparezca un
texto. Otro tipo de sentencia que podríamos usar es la ya vista en la unidad anterior
“[Link]”, en la que “identificadorNuestro” es el nombre de la id
que le demos en la etiqueta label.
class Concatenacion
{
public static void Main()
{
string concat = “España” + “campeona” + “del” +
“mundo”;
[Link](concat);
}
}
118
3: Introducción a C#
■■ Un tipo por archivo. Los archivos fuente contendrán un único tipo. El nombre del
archivo será el mismo que el usado en la declaración del tipo.
■■ Ajuste de línea. Cuando una expresión no quepa en una sola línea, se procurará
dividir de acuerdo a los siguientes criterios:
■■ Densidad vertical. Implica asociación, ahí donde las líneas de código tienen
mucha relación entre ellas, deben mostrar un alto grado de densidad vertical. Se
debe rodear con una línea en blanco cada bloque de código. Bloques de código
pueden ser un bloque de declaraciones using, la declaración de un espacio de
nombres, un método, una función, etc.
119
[Link] con C#
3.6.2. Regiones
Visual [Link] ha introducido una forma de anidar y nombrar, un conjunto de
instrucciones, funciones o declaraciones. Esto se realiza usando el juego de directivas
#region y #endregion. Al anidar un conjunto de sentencias dentro de estas directivas,
el ide de .NET nos permite contraer y expandir estas sentencias mediante el uso del
ratón.
■■ Las etiquetas de regiones deben de indentarse al mismo nivel que el código que
engloban.
□□ Estado
●● Constantes
●● Variables miembro
●● Propiedades
□□ Comportamiento
●● Constructores
●● Métodos privados
●● Métodos públicos
●● Eventos
■■ Si bien este recurso es útil para clarificar y hacer más manejable el código
fuente, el abuso puede generar un código poco práctico, en el que sea costoso
encontrar el código que se busca. Así pues, se aconseja no excederse en el uso
de regiones.
3.6.3. Declaraciones
Cuando se codifican clases, interfaces u otros tipos con C#, seguiremos las siguientes
reglas:
■■ La llave de clausura debe aparecer en una nueva línea, a partir del último carácter
compilable de la definición de la clase o interfaz.
120
3: Introducción a C#
La variable miembro siempre debe ser privada (o protegida), mientras que se puede
jugar con la visibilidad general de la propiedad y de sus cláusulas get y set para
exponer adecuadamente los datos.
3.6.5. Inicializaciones
Inicializar las variables locales lo antes posible, de ser posible en la propia declaración.
3.6.6. Sentencias
Las instrucciones condicionales son instrucciones que permiten ejecutar bloques de
instrucciones sólo si se da una determinada condición.
En los siguientes subapartados de este punto se describen cuáles son las instrucciones
condicionales y iterativas disponibles en C#.
01. id = customerList[i].ID;
01. //Ejemplo 1
121
[Link] con C#
02. if (condición)
03. {
04. //Acciones
05. }
06.
07. //Ejemplo 2
08. if (condición)
09. {
10. //Acciones
11. }
12. else
13. {
14. //Acciones
15. }
16.
17. //Ejemplo 3
18. if (condición)
19. {
20. //Acciones
21. }
22. else if (condición)
23. {
24. //Acciones
25. }
26. else
27. {
28. //Acciones
29. }
122
3: Introducción a C#
03. //Acciones
04. }
05.
06. do
07. {
08. //Acciones
09. }
10. while (condición)
01. //Formato 1
02. try
03. {
04. //Acciones que pueden causar una excepción.
05. }
06. catch
07. {
08. //Acciones que se realizarán al capturar la
excepción.
09. }
10.
11.
12. //Formato 2
13. try
14. {
15. //Acciones que pueden causar una excepción.
16. }
17. catch
123
[Link] con C#
18. {
19. //Acciones que se realizarán al capturar la
excepción.
20. }
21. finally
22. {
23. //Acciones que se realizarán siempre, haya o no
excepción.
24. }
■■ Mayúsculas: todas las letras del identificador van en mayúsculas. Utilice esta
convención solo para identificadores que estén formados por dos o menos
letras. Por ejemplo:
01. [Link]
02. [Link]
Además, puede que sea necesario utilizar mayúsculas en los identificadores para
mantener la compatibilidad con esquemas existentes de símbolos no administrados,
donde los caracteres en mayúsculas se utilizan con frecuencia en valores de
constantes y enumeraciones. En general, estos símbolos no deben ser visibles fuera
del ensamblado en el que se utilizan.
124
3: Introducción a C#
■■ No debes crear dos espacios de nombres con nombres que difieran solo en las
mayúsculas y minúsculas. Por ejemplo, un lenguaje que no haga distinción entre
mayúsculas y minúsculas no distingue entre las dos declaraciones siguientes de
espacio de nombres.
namespace [Link];
namespace [Link];
■■ No debes crear una función con nombres de parámetros que difieran solo en las
mayúsculas y minúsculas. El siguiente ejemplo es incorrecto.
[Link] p
■■ No debes crear un tipo con nombres de propiedades que difieran solo en las
mayúsculas y minúsculas. En el siguiente ejemplo, int Color y int COLOR son
nombres de propiedades incorrectos, ya que difieren solo en el uso de las
mayúsculas y minúsculas.
■■ No debes crear un tipo con nombres de métodos que difieran solo en las
mayúsculas y minúsculas. En el siguiente ejemplo, calculate y Calculate son
nombres de métodos incorrectos, ya que difieren solo en el uso de las mayúsculas
y minúsculas.
void calculate()
void Calculate()
3.6.9. Abreviaturas
Para evitar confusiones y garantizar la interoperación entre lenguajes, sigue estas
reglas con respecto a la utilización de abreviaturas.
125
[Link] con C#
■■ Evita usar nombres de clase que dupliquen a los namespaces del .NET
Framework usados comúnmente. Por ejemplo, no uses los siguientes nombres
de clase: System, Collections, Forms o UI. Visita el listado de namespaces del
BCL para comprobarlo.
■■ Haz distinciones con sentido. Cuando se usa un mismo nombre para referirse
a dos cosas distintas en un mismo ámbito de variables, se puede estar tentado
de cambiar uno de ellos de una forma arbitraria, como por ejemplo, añadir un
número al final de la palabra:
01. //MAL!!
02. public static void CopyChars(char[] a1, char[] a2)
03. {
04. for (int i = 0; i < [Link]; i++)
05. {
06. a2[i] = a1[i];
07. }
126
3: Introducción a C#
08. }
09.
10. //BIEN!!
11. public static void CopyChars(char[] inputData,
char[] outputData)
12. {
13. for (int i = 0; i < [Link]; i++)
14. {
15. outputData[i] = inputData[i];
16. }
17. }
01. //MAL!!
02. class DtaRcrd102
03. {
04. private Date genymdhms;
05. private Date modymdhms;
06. private String pszqint = “102”;
07. }
08.
09. //BIEN!!
10. class Customer
11. {
12. private Date generationTimestamp;
13. private Date modificationTimestamp;
14. private String recordId = “102”;
15. }
■■ Usa nombres fáciles de buscar. Los nombres de una sola letra y las constantes
numéricas son un problema a la hora de localizarlas en un código. Estos dos
elementos solo deberían ser utilizados en un contexto muy localizado de código,
por el contrario, si una variable se va a usar múltiples veces en el código, éstas
deben tener nombres fáciles de buscar.
01. //Ejemplo
02. int realDaysPerIdealDay = 4;
03. const int WORK_DAYS_PER_WEEK = 5;
04. int sum = 0;
05. for (int j = 0; j < NUMBER_OF_TASKS; j++)
06. {
07. int realTaskDays = taskEstimate[j] *
realDaysPerIdealDay;
127
[Link] con C#
01. //MAL!!
02. public class Part
03. {
04. private String m_Name; // Nombre del artículo
05.
06. public String Name
07. {
08. get { return m_Name; }
09. set { m_Name = value; }
10. }
11. }
12.
13. //BIEN!!
14. public class Part
15. {
16. private String name;
17.
18. /// <summary>
19. /// Nombre del artículo
20. /// </summary>
21. public String Name
22. {
23. get { return name; }
24. set { name = value; }
25. }
26. }
■■ Además, evita usar identificadores que entren en conflicto con las siguientes
keywords o palabras reservadas:
AddHandler AddressOf Alias And Ansi As Assembly Auto Base Boolean ByRef
Byte ByVal Call Case Catch CBool CByte CChar CDate CDec CDbl Char CInt
Class CLng CObj Const CShort CSng CStr CType Date Decimal Declare Default
Delegate Dim Do Double Each Else ElseIf End Enum Erase Error Event Exit
ExternalSource False Finalize Finally Float For Friend Function Get GetType Goto
128
3: Introducción a C#
Handles If Implements Imports In Inherits Integer Interface Is Let Lib Like Long
Loop Me Mod Module MustInherit MustOverride MyBase MyClass Namespace
New Next Not Nothing NotInheritable NotOverridable Object On Option Optional
Or Overloads Overridable Overrides ParamArray Preserve Private Property
Protected Public RaiseEvent ReadOnly ReDim Region REM RemoveHandler
Resume Return Select Set Shadows Shared Short Single Static Step Stop String
Structure Sub SyncLock Then Throw To True Try TypeOf Unicode Until volatile
When While With WithEvents WriteOnly Xor eval extends instanceof package var
■■ Utiliza nombres que describan el significado del tipo, en vez de nombres que
describan el tipo.
129
[Link] con C#
01. [Link][.Feature][.Design]
Por ejemplo:
01. [Link]
02. [Link]
■■ Un espacio de nombres anidado debe tener una dependencia en los tipos del
espacio de nombres contenedor.
130
3: Introducción a C#
■■ No utilices el mismo nombre para un espacio de nombres y para una clase. Por
ejemplo, no proporciones un espacio de nombres Debug y una clase Debug.
■■ Por último, ten en cuenta que el nombre de un espacio de nombres no tiene que
ser análogo al nombre del ensamblado.
Cuando sea apropiado, utiliza una palabra compuesta en el nombre de una clase
derivada. La segunda parte del nombre de la clase derivada debe ser el nombre de la
clase base. Por ejemplo, ApplicationException es un nombre correcto para una clase
derivada de la clase Exception, pues ApplicationException es una clase de Exception.
En esta regla se debe utilizar la lógica. Por ejemplo, Button es un nombre adecuado
para una clase derivada de Control. Aunque un botón es una clase de control, si incluye
Control como parte del nombre de una clase alargaría el nombre innecesariamente.
131
[Link] con C#
■■ Incluye un prefijo con la letra I en los nombres de interfaces para indicar que el
tipo es una interfaz.
■■ Los nombres deben ser distintos solo en el prefijo I del nombre de la interfaz.
132
3: Introducción a C#
01. RemoveAll()
02. GetCharArray()
03. Invoke()
133
[Link] con C#
■■ Es conveniente crear una propiedad con el mismo nombre que el tipo subyacente
correspondiente. Por ejemplo, si declaras una propiedad con el nombre Color, el
tipo de propiedad también deberá llamarse Color. Ve el ejemplo que se muestra
más adelante en este tema.
01. public enum Color {// Insert code for Enum here.}
02.
134
3: Introducción a C#
135
[Link] con C#
3.6.19. Comentarios
En C# se pueden insertar dos tipos de comentarios: implementación y documentación.
■■ Evita incluir comentarios de separación, como por ejemplo una línea entera con
asteriscos. Para separar código de comentarios, usa una línea en blanco.
■■ Evita los bloques de comentarios con tipografías para englobar a los propios
comentarios. Esto puede parecer muy estético, pero resulta difícil de mantener.
136
3: Introducción a C#
■■ Mantén una visión global. Piensa que lo que ahora puede resultarte obvio, puede
no serlo dentro de un año.
■■ Usa comentarios para avisar de problemas o bugs existentes, para evitar las
reincidencias en los mismos.
01. // Esto es
02. // un comentario
03. // de bloque
137
[Link] con C#
01. if(HasChilds(idParent))
02. {
03. return true; // Caso especial
04. }
05. else
06. {
07. return Validate(idParent a); // Validación
08. }
■■ Explicación de intenciones: sirven para explicar los motivos que hay detrás de
una decisión en la implementación.
138
3: Introducción a C#
□□ UNDONE: señala un lugar donde falta código por implementar para alcanzar
la funcionalidad requerida.
139
[Link] con C#
01. // Ejemplos
02.
03. public virtual String AssemblyCodeBase
04. {
05. get { return m_AssemblyCodeBase; }
06. private set
07. {
08. if (m_AssemblyCodeBase != value)
09. {
10. m_AssemblyCodeBase = value;
11. //HACK: Lo pongo aquí para forzar provisionalmente
la carga del ensamblado
12. [Link]();
13. }
14. }
15. }
16.
17. private void cmdAdd_Click(object sender, EventArgs
e)
18. {
19. foreach (ListViewItem item in ListGAC.
SelectedItems)
20. //TODO: Falta código para controlar versiones de
ensamblado
21. //SharpDevelop lo hace con el check de última
versión y
22. //luego filtra la lista que muestra en el ListView
23. [Link]([Link],
[Link], (String)[Link]);
24. [Link]();
25. }
26.
27. void ModelService_ModelSaved(object sender,
ModelEventArgs e)
28. {
29. //UNDONE: No implementado
30. }
140
3: Introducción a C#
■■ Ruido: comentarios como éstos solo pueden considerarse de este tipo, ruidosos:
141
[Link] con C#
16. {
17. DoSending();
18. }
19. catch (SocketException e)
20. {
21. // Normal. Alguien ha parado el request.
22. }
23. catch (Exception e)
24. {
25. try
26. {
27. [Link](ErrorResponder.
MakeExceptionString(e));
28. [Link]();
29. }
30. catch (Exception e1)
31. {
32. //Give me a break!!
33. }
34. }
35. }
142
3: Introducción a C#
3.7. Ejemplo
Hasta ahora hemos visto cómo funciona C# por separado, pero vamos a realizar un
ejemplo en el que incluyamos código [Link] y código C#.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
int pasajeros;
int contador;
//También se puede así: int pasajeros,
contador;
if ([Link][“Origen”] != null)
{
switch ([Link][“Origen”])
{
case “Nueva York”:
[Link] = “Salida desde Nueva
York, Nueva York”;
break;
case “Chicago”:
[Link] = “Salida desde
Chicago, Illinois”;
break;
case “Miami”:
[Link] = “Salida desde
Miami, Florida”;
break;
143
[Link] con C#
default:
[Link] = “Tiene que elegir
entre una de las ciudades”;
break;
}
}
if ([Link][“Destino”] != null)
{
switch ([Link][“Destino”])
{
case “Nueva York”:
[Link] = “Llegada a Nueva
York, Nueva York <hr/>”;
break;
case “Chicago”:
[Link] = “Llegada a
Chicago, Illinois <hr/>”;
break;
case “Miami”:
[Link] = “Llegada a Miami,
Florida <hr />”;
break;
default:
[Link] = “Tiene que elegir
entre una de las ciudades”;
break;
}
}
if ([Link][“numPasaj”] != null)
{
pasajeros = Convert.ToInt32(Request.
Form[“numPasaj”]);
[Link] = “”;
for (contador = 0; contador < pasajeros;
contador++)
{
[Link] += “Nombre
Pasajero:...............<br />” + “Nacionalidad
pasajero:............... <br /> <hr />”;
}
if (pasajeros <= 0)
{
[Link] = “Me parece que van
144
3: Introducción a C#
pocos pasajeros”;
}
else if (pasajeros >= 1 && pasajeros <= 5)
{
[Link] = “Que tengan un buen
viaje”;
}
else
{
[Link] = “Tanta gente no puede
ir”;
}
}
}
}
__________________________________________________________
<html xmlns=”[Link]
<head>
<title> Compra del Billete de avión </title>
</head>
<body>
<form id = “Form1” runat = “server”>
Elija su ciudad de origen:
<br />
<asp:RadioButtonlist ID = “Origen” runat = “server”>
<asp:listitem>Nueva York</asp:listitem>
<asp:listitem>Chicago</asp:listitem>
<asp:listitem>Miami</asp:listitem>
</asp:radioButtonlist>
<br />
Elija su ciudad destino:
<br />
<asp:RadioButtonlist ID = “Destino” runat = “server”>
<asp:listitem>Nueva York</asp:listitem>
<asp:listitem>Chicago</asp:listitem>
<asp:listitem>Miami</asp:listitem>
145
[Link] con C#
</asp:radioButtonlist>
Elija el tipo de viaje
<br />
<asp:RadioButtonlist ID = “IdaVuelta” runat =
“server”>
<asp:listitem>Ida</asp:listitem>
<asp:listitem>Ida y Vuelta</asp:listitem>
</asp:radioButtonlist>
Introduzca el número de pasajeros:
<br />
<asp:DropDownList ID = “numPasaj” runat = “server”>
<asp:ListItem> 0 </asp:ListItem>
<asp:ListItem> 1 </asp:ListItem>
<asp:ListItem> 2 </asp:ListItem>
<asp:ListItem> 3 </asp:ListItem>
<asp:ListItem> 4 </asp:ListItem>
<asp:ListItem> 5 </asp:ListItem>
<asp:ListItem> +6 </asp:ListItem>
</asp:DropDownList>
<br />
<input type = “submit” value = “Aceptar”>
<br />
<asp:Label ID = “mensaje” runat = “server” />
<br />
<asp:Label ID = “mensaje1” runat = “server”/>
<br />
<asp:Label ID = “mensaje2” runat = “server”/>
<br />
<asp:Label ID = “mensaje3” runat = “server”/>
</form>
</body>
</html>
En este ejemplo se pueden ver varias de las estructuras que hemos visto durante
el tema. En un primer lugar tenemos dos estructuras switch-case para elegir la
ciudad origen y destino, después tenemos una estructura for para elegir el número
de pasajeros y dependiendo de ello se imprimirán por pantalla tantos textos como
pasajeros hayamos elegido, y dentro de este bucle tenemos una estructura if-else-if
para indicar si el número de pasajeros elegidos es correcto o no. El resultado obtenido
puede ser el siguiente:
146
3: Introducción a C#
147
3: Introducción a C#
RESUMEN
■ C# es un lenguaje de programación orientado a objetos.
■
La programación orientada a objetos se cimienta sobre los términos clase, interfaz,
herencia y objetos.
■
C# dispone de varias palabras clave que no pueden ser usadas libremente. Hay que
tener un control exhaustivo de qué palabras estamos usando.
■
Un tipo es el lugar donde se guarda cierta información sobre los valores que puede
tomar un objeto. En C# los tipos generales son entero, double, booleano, char, string
y array.
■
En la programación en C# existen otros elementos como las variables, las constantes
y los enumerados, que nos sirven para dar valores a los tipos que hayamos creado.
■
Los símbolos que llevan asignados una operación predefinida sobre los operandos
para que generen un resultado son los operadores y sirven para dar más consistencia
a nuestro código. Los operadores en C# se pueden clasificar en operadores de
asignación, aritméticos, comparación y lógicos.
■
Las estructuras de control sirven para dar un orden a nuestro código y saber qué se
debe ejecutar primero y qué se debe ejecutar después. En C# las estructuras pueden
ser de salto condicional, de salto incondicional y de bucles. En las de salto condicional
encontramos las if-else y las switch-case y entre las de bucle for, foreach, while, do-
while, break-continue.
149
4
[Link] con C#
4
DIDÁCTICA
UNIDAD
4. Elementos de [Link]
4: Elementos de [Link]
ÍNDICE
ÍNDICE.......................................................................................................................................................................... 153
OBJETIVOS................................................................................................................................................................ 155
INTRODUCCIÓN....................................................................................................................................................... 156
4.1. Programación basada en eventos...................................................................................................................... 157
4.1.1. Eventos............................................................................................................................................................. 157
4.1.2. Otros tipos de eventos......................................................................................................................................... 161
4.2. Postback.............................................................................................................................................................. 164
4.3. Objetos................................................................................................................................................................. 171
4.4. Más objetos en [Link]................................................................................................................................... 177
4.4.1. Namespaces...................................................................................................................................................... 177
4.4.2. Links a otras páginas........................................................................................................................................... 177
4.4.3. Estados de sesión............................................................................................................................................... 179
4.5. Relaciones entre clases...................................................................................................................................... 182
4.5.1. Relación “Usa”.................................................................................................................................................... 182
4.5.2. Relación “Contiene”............................................................................................................................................. 185
4.5.3. Relación “Es-un(a)”.............................................................................................................................................. 186
4.6. Estructuras de datos........................................................................................................................................... 188
4.6.1. Listas................................................................................................................................................................ 188
4.6.2. Arrays................................................................................................................................................................ 190
4.6.3. Arraylist.............................................................................................................................................................. 192
4.6.4. Sortedlist........................................................................................................................................................... 194
4.6.5. Hashtable........................................................................................................................................................... 197
4.6.6. Dictionary........................................................................................................................................................... 199
RESUMEN................................................................................................................................................................... 201
153
4: Elementos de [Link]
OBJETIVOS
■ Reconocer los eventos.
■ Diferenciar entre los distintos tipos de relación entre clases: herencia, uso y contenido.
■
Saber usar otras estructuras nuevas de datos como son las colecciones, desde listas
hasta Hashtables.
155
[Link] con C#
INTRODUCCIÓN
En la anterior unidad estuvimos hablando sobre Ya en la unidad anterior estuvimos hablando de objetos
algunos elementos de la programación orientada a a rasgos generales, pero vamos a intentar conocer
objetos y sobre ciertos aspectos de la programación más a fondo los objetos. En la programación Web
en C#. En esta unidad vamos a hablar de aspectos el uso de los objetos es fundamental, ya que gracias
sobre programación basada en eventos y postback, a ellos nos podemos ahorrar mucho tiempo. Un
que no tiene una traducción literal, pero podemos programador tiene que aprender a sacar rendimiento
averiguar intuitivamente su significado. Podemos de lo que ya está hecho, es decir, no debe ponerse
definirlo como el proceso que existe cuando enviamos a programar cosas que ya existen, sino que debe
una página al servidor y éste nos devuelve otra página usarlas o si no modificarlas para poderlas usar a su
con la respuesta. Además, vamos a hacer un estudio antojo. Esta posibilidad nos la dan los objetos, ya
más exhaustivo sobre los elementos estudiados en que con la creación de un objeto podemos usar ese
la unidad anterior como son los objetos, herencia código para poder crearnos otros objetos parecidos.
y haremos más ejemplos incluidos dentro de la Además, para poder aumentar la eficiencia del código y
tecnología [Link]. aumentar la claridad y elegancia de este es importante
Muchas veces estamos interactuando con el servidor agrupar los objetos que sean parecidos para poder
sin darnos cuenta a través de eventos. Todas las acceder a ellos de una manera transparente. El uso de
acciones que realicemos que hagan modificar al las colecciones va a ser fundamental en este sentido,
servidor pueden ser consideradas como eventos. El ya que nos proporciona una manera fácil de acceder
simple hecho de pinchar sobre un botón es realizar a los objetos.
una acción y que se provoque un evento.
156
4: Elementos de [Link]
4.1.1. Eventos
Podemos decir que un evento es una situación que ocurre en un determinado momento
y que puede ser respondida de diferentes formas. Así que cuando un evento ocurre,
el sistema (o usuario) lo detecta y éste responde a él. Como ejemplo hemos hablado
sobre cuando un usuario hace click en un botón, el sistema se da cuenta de la acción
y empieza a ejecutar ésta.
En [Link] podemos decir que los eventos ocurren mientras nosotros estamos
navegando por nuestra página Web. Éstos ocurren en el servidor como la inicialización,
el procesamiento y la forma en que se muestra la información. Todo esto ocurre
cuando se llama al servidor.
void Page_Init()
{
// Código
}
void Page_Load()
{
// Código
}
157
[Link] con C#
■■ Eventos de control: cuando los controles del servidor han sido descargados,
éstos pueden responder a eventos como clics o algún cambio en cualquier parte
de la página.
■■ Page_Unload(): este evento viene a pasar cuando se trata con los eventos de
control. En esta ocasión los eventos ocurren una vez el código [Link] ha sido
ejecutado completamente.
void FuncionAnidada()
{
// Código de la función anidada
}
void Page_Load()
{
FuncionAnidada();
}
void FuncionAnidada();
{
// Código de la función anidada
}
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
158
4: Elementos de [Link]
set
{
numero = value;
}
}
Numero++;
[Link] += “<br> Se ha cargado la página “ +
Numero + “ Page_Load()<br />”;
Numero++;
[Link] += “<br> Otra vez se ha cargado la
página “ + Numero + “ Page_Load()<br />”;
}
}
__________________________________________________________
159
[Link] con C#
<html xmlns=”[Link]
<head>
<title> Eventooooooooos </title>
</head>
<body>
<form id = “Form1” runat = “server”>
<asp:Label ID = “init” runat = “server”> </asp:Label>
<asp:Label ID = “load” runat = “server”> </asp:Label>
<asp:Label ID = “load2” runat = “server”> </asp:Label>
<br />
<br />
<input type = “submit” value = “Prueba” />
<br />
</form>
</body>
</html>
160
4: Elementos de [Link]
Este comando lo debemos situar en nuestro código entre las etiquetas <form> y </
form>.
161
[Link] con C#
Estos controles pueden ser usados también para la tecnología [Link], pero además,
ésta puede implementar varios controles más para ampliar nuestra gama de controles.
La diferencia que radica entre la forma de programar con HTML y con [Link] es que
en este último cuando hagamos la llamada a la acción no la hacemos directamente,
sino que tenemos que crearnos dicha función a la que se acude desde una etiqueta
asp de la siguiente manera:
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
162
4: Elementos de [Link]
<html xmlns=”[Link]
<head>
<title> Eventos </title>
</head>
<body>
<form id = “Form1” runat = “server”>
<asp:CheckBox ID = “Regalo” Text = “Eres el visitante
1.999.999. Pulsa para ver tu regalo” runat=”server” />
<br />
<br />
<asp:Button ID = “Botoncito” Text = “Aceptar” runat =
“server” />
<asp:Label ID = “mensaje” runat = “server” />
<br />
</form>
</body>
</html>
Como se puede observar, hemos creado una función denominada Eventos a la cual se
accede desde la etiqueta <asp:Button ID= “Botoncito” Text=”Aceptar”
onclick=”Eventos” runat =”server” />.
Además, vemos que cuando creamos la función hay dos atributos: uno que es para
comunicar que vamos a enviar al servidor un objeto (el sender) y otro es para decir que
vamos a enviar eventos.
163
[Link] con C#
4.2. Postback
Postback es el proceso a través del cual el navegador manda la información al servidor
diciéndole a éste que procese el evento y que cuando lo haga mande la información
resultante al navegador. Postback solo sucede cuando estamos programando
formularios Web y en su mayoría cuando estamos programando con ASP o [Link].
Este componente se utiliza sobre todo en casos de comprobación de contraseñas,
cambios de datos de usuario de algún registro de alguna página Web.
En varias ocasiones de este curso hemos visto cómo puede actuar una aplicación con
postback.
<html>
<head>
<title> Eventos </title>
</head>
<body>
<form runat = “server”>
¿Qué canal de TV le gusta más?. Vote por favor.
<asp:RadioButtonList ID = “RadioButtonList1” runat =
“server”>
<asp:ListItem id = “uno” Value = “TVE1” runat =
“server” />
<asp:ListItem id = “dos” Value = “TVE2” runat =
“server” />
<asp:ListItem id = “tres” Value = “Antena 3” runat
= “server” />
<asp:ListItem id = “cuatro” Value = “Cuatro” runat
= “server” />
<asp:ListItem id = “cinco” Value = “Telecinco”
runat = “server” />
<asp:ListItem id = “seis” Value = “La Sexta” runat
= “server” />
</asp:RadioButtonList>
<br />
<br />
</form>
</body>
</html>
164
4: Elementos de [Link]
En este ejemplo se puede ver que si seleccionamos una opción y le damos a aceptar
nos aparece esta ventana modal (que aparece gracias a la palabra alert). Si en esta
ventana le damos al botón que aparece por defecto de aceptar volvemos a nuestra
página inicial.
Vamos a realizar otro ejemplo antes de seguir con el temario. En este caso vamos a
ver una nueva estructura y algunas palabras que nos pueden ser útiles a la hora de
programar.
Este ejemplo puede ser el principio de cómo programar una calculadora. Nosotros
vamos a hacer solo una pequeña parte de lo que podría ser una calculadora real, para
ello hemos utilizado el siguiente código que vamos a explicar a continuación.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
165
[Link] con C#
[Link] = [Link]();
}
catch
{
[Link] = “Error”;
}
}
protected void Resta(object sender, EventArgs args)
{
try
{
double num = [Link] ([Link]) -
[Link] ([Link]);
[Link] = [Link]();
}
catch
{
[Link] = “Error”;
}
}
protected void Raiz(object sender, EventArgs args)
{
try
{
166
4: Elementos de [Link]
<html xmlns=”[Link]
<head>
<title> Calculadora </title>
</head>
<body>
<form id=”Form1” runat=”server”>
Si quiere sumar o restar, introduzca un número en las
dos siguientes cajas.
<br />
<asp:TextBox ID=”caja1” runat=”server”> </asp:TextBox>
<asp:Button ID=”suma” runat=”server” Text=”+”
OnClick=”Suma” />
<br />
<asp:TextBox ID=”caja2” runat=”server”> </asp:TextBox>
<asp:Button ID=”resta” runat=”server” Text=”-”
OnClick=”Resta” />
<br />
<br />
<b>Resultado =
<asp:Label ID=”respuesta” runat=”server”> </
asp:Label></b>
</form>
</body>
</html>
167
[Link] con C#
Como ejercicio para el alumno puede intentar ejecutar una calculadora que contenga
el resto de botones con las operaciones sumar, restar, multiplicar y dividir, además de
contener un botón de igual y los correspondientes botones con los números desde el
0 hasta el 9. Es un ejercicio no más complicado que lo que acabamos de hacer.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
168
4: Elementos de [Link]
set
{
numero = value;
}
}
Numero++;
[Link] += “<br> Otra vez se ha cargado la
página “ + Numero + “ Page_Load()<br />”;
}
}
}
169
[Link] con C#
170
4: Elementos de [Link]
4.3. Objetos
En el tema anterior hicimos una breve introducción a los principales elementos de
la programación orientada a objetos y en esta unidad profundizaremos sobre ellos y
haremos algunos ejemplos que nos ayuden a entender estos conceptos.
El uso de objetos en la programación nos ayuda a ser mucho más eficientes a la hora
de programar y tener nuestro código más ordenado. Además, tiene la ventaja de que
se puede reusar el código sin necesidad de tener que reescribir código.
Así que como dijimos en la unidad 3, un objeto es un trozo de código que realiza
las tareas de un programa y que tiene la información y capacidades necesarias para
poder realizarlas.
Éste es un caso de lo que podría ser un objeto, aunque si nos fijamos el mundo real está
lleno de objetos y cada uno tiene una serie de propiedades. Desde el punto de vista
de la programación las personas mismas somos objetos con nuestras propiedades
como son el nombre, los apellidos, la edad, el NIF o el domicilio. Esto nos ayuda a
modelar el mundo real y que cada objeto tenga unas características que los distinga
unos de otros.
Como vimos en la unidad 3 para crear un objeto tenemos que definir una clase donde
vamos a describir las características y el comportamiento de los objetos dependiendo
de su estado, que eran las características que tenía un objeto en un determinado
momento. Dentro de una clase podemos considerar las propiedades de cada objeto
y los métodos, que son aquellos trozos de código, donde se realizan las acciones que
deben realizar.
Así que antes de realizar cualquier tipo de código debemos saber exactamente cuáles
van a ser las propiedades que tenga cada objeto y cuáles son las acciones que va a
realizar (métodos). Así que vamos a crear un objeto que sea coche con las siguientes
características: color, número de asientos, velocidad máxima y número de marchas.
Como métodos va a tener el cambio de marchas y cambio de velocidad.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
171
[Link] con C#
using [Link];
172
4: Elementos de [Link]
if (velocidad < 0)
velMax -= 10;
if (velocidad > 0)
velMax += 10;
if (velMax > 130)
velMax = 130;
if (velMax < 0)
velMax = -1;
}
public int Marchas
{
get
{
return marchas;
}
}
173
[Link] con C#
[Link](+10);
[Link](+1);
[Link](“<br /> <br /> <b> El SuperFerrari
ha cambiado sus propiedades </ b> <br /> <br />”);
[Link](“<br /> El SuperFerrari es de color
<b>” + [Link] + “</b>”);
[Link](“<br /> El SuperFerrari tiene <b>”
+ [Link] + “</b>” + “ plazas.”);
[Link](“<br /> El SuperFerrari va a <b>”
+ [Link] + “</b>” + “ km/hora.”);
[Link](“<br /> El SuperFerrari va en <b>”
+ [Link] + “</b>” + “º velocidad.”);
[Link] = “Rojo”;
[Link] = 5;
[Link](+10);
[Link](+1);
[Link](“<br /> <br /> <b> El SuperFerrari
ha cambiado sus propiedades </ b> <br /> <br />”);
[Link](“<br /> El SuperFerrari es de color
<b>” + [Link] + “</b>”);
[Link](“<br /> El SuperFerrari tiene <b>”
+ [Link] + “</b>” + “ plazas.”);
[Link](“<br /> El SuperFerrari va a <b>”
+ [Link] + “</b>” + “ km/hora.”);
[Link](“<br /> El SuperFerrari va en <b>”
+ [Link] + “</b>” + “º velocidad.”);
}
}
__________________________________________________________
<html xmlns=”[Link]
<head>
<title> Mi Cochazo </title>
</head>
<body>
174
4: Elementos de [Link]
</body>
</html>
Como vemos, hemos creado un objeto nuevo llamado MiCoche con una serie de
propiedades que podemos ir modificando en nuestro código simplemente copiando y
pegando. Como vemos, lo primero que hacemos es declarar la clase, posteriormente
definimos los atributos que va a tener el objeto y creamos un método get y set para
cada uno de ellos excepto cuando tenemos un método que afecte a los atributos. Se
puede ver que cuando exponemos las propiedades las creamos públicas para que
puedan ser usadas desde cualquier lugar del código y además, debe llevar un tipo,
que es aquél que vaya a devolver nuestro código, por ejemplo, para velocidad será
un entero y para color, un string o cadena. El tipo void no devuelve ningún tipo en
concreto.
La siguiente parte del código está dedicada a escribir lo que se debe mostrar en el
navegador y posteriormente es donde podemos modificar los atributos. Los atributos
pueden ser modificados cada vez que queramos, así como las veces que queramos
que se muestre en la pantalla. Hemos de decir que cada vez que queramos modificar
un objeto lo tendremos que hacer a través de una llamada, así mismo como hemos
hecho nosotros llamando a [Link].
175
[Link] con C#
En este ejemplo no hemos visto el caso en el que los objetos se inicializan directamente.
Imaginemos que queremos que nuestro coche tenga un precio inicial, obviamente
tendríamos que declarar una variable llamada “precio” de tipo entero, sus métodos
get y set y la única diferencia respecto al código anterior sería la de crear el siguiente
trozo de código:
public MiCoche ()
{
precio = 300000;
}
Si tuviésemos que crear más constructores, se haría en esa zona de código con los
valores inicializados.
176
4: Elementos de [Link]
4.4.1. Namespaces
A modo de recordatorio podemos decir que los namespaces son un conjunto de
clases similares que se agrupaban para poder ser usadas por el programador en
cualquier momento. Si, por ejemplo, necesitamos clases que nos puedan ayudar a
conectarnos a una base de datos, usaremos el namespace [Link], el cual
agrupa todas las clases necesarias para ello.
A nosotros nos viene especialmente bien el uso del namespace relacionado para
la creación de páginas Web y para ello usaremos [Link]. Es muy importante
recordar que los namespaces se importan al principio del código, es decir, lo primero.
En posteriores unidades veremos cómo el propio usuario puede ser capaz de crear
sus propios namespaces.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
177
[Link] con C#
args)
{
if (!(IsPostBack))
{
[Link] = “Acceder”;
[Link](“[Link]
[Link](“[Link]
com”);
[Link](“[Link]
[Link](“[Link]
}
}
}
___________________________________________________
<html xmlns=”[Link]
<head id = “Head1” runat = “server”>
<title> Redirección </title>
</head>
<body>
<form id = “form1” method = “post” runat = “server”>
<div>
<asp:DropDownList ID = pg runat = “server”> </
asp:DropDownList>
<asp:Button ID = “msg” runat = “server” Onclick = “Ir”
Text = “ “ />
</div>
</form>
178
4: Elementos de [Link]
</body>
</html>
Esta propiedad se puede usar también para contar el número de visitantes que tiene
una página o el número de elementos descargados de una página.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
179
[Link] con C#
{
if (Session[“Examen”] != null)
{
int i = (int)Session[“Examen”];
i++;
Session[“Examen”] = (object)i;
}
else
{
Session[“Examen”] = 1;
}
}
}
__________________________________________________________
<html xmlns=”[Link]
<head id = “Head1” runat = “server”>
<title> Sesion </title>
</head>
<body>
<form id = “form1” method = “post” runat = “server”>
<div>
<asp:Button ID = “msg” runat = “server” Onclick =
“Respuesta” Text = “Enviar” />
<br />
Respuestas enviadas: <%=Session[“Examen”] %>
</div>
</form>
</body>
</html>
En este tipo de objetos se hace uso de una propiedad llamada session que sirve para
devolvernos un objeto, en nuestro caso una nueva respuesta.
180
4: Elementos de [Link]
Esto también se puede usar cuando hemos iniciado alguna sesión de alguna
página en la que estemos registrados. Por ejemplo, estamos viendo nuestro correo
electrónico. Si queremos desconectarnos o que pasado un tiempo se desconecte
automáticamente se hará gracias a este tipo de directivas. Por ejemplo, abandon()
servirá para desconectarnos manualmente, isnewsession() servirá para iniciar una
nueva sesión y timeout servirá para que el servidor finalice automáticamente la sesión
una vez haya pasado un tiempo sin ser usada.
Todas las anteriores directivas serán usadas del mismo modo que la directiva session
y todas ellas son del tipo Httpsessionstate.
181
[Link] con C#
Aquí vamos a ver un ejemplo en el que creamos una clase conductor que va a usar
una clase coche, ya creada anteriormente aunque con muchas modificaciones.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
182
4: Elementos de [Link]
{
return nombre;
}
}
}
void Page_Load()
183
[Link] con C#
}
___________________________________________________
<html xmlns=”[Link]
<head id = “Head1” runat = “server”>
<title> Fórmula 1 </title>
</head>
<body>
184
4: Elementos de [Link]
</body>
</html>
Como podemos observar, tenemos esas dos clases y el objeto conductor puede usar
cualquiera de los métodos creados en la clase coche. En la clase persona no se
ha hecho algo mucho más distinto que lo que se hace en otras clases. En la clase
MiCoche se han creado dos nuevos atributos y un nuevo constructor. Luego dispone
de varios métodos nuevos y es en el Page_Load donde la clase persona hace uso de
los métodos de la clase coche.
185
[Link] con C#
{
return cuentaKiloms;
}
set
{
cuentaKiloms = value;
}
}
…
MiCoche superMercedes = new MiCoche();
[Link] = new CuentaKm(200);
…
Así que vamos a crear una clase vehículo que tenga unas propiedades más generales
y que la clase coche pueda usarse sin ningún problema.
186
4: Elementos de [Link]
}
}
}
public class MiCoche : Vehiculo
{
…
}
void Page_Load()
{
MiCoche superFerrari = new MiCoche();
MiCoche superMercedes = new MiCoche();
[Link] = new CuentaKm(200);
[Link] = 4;
[Link] (“<br /> El SuperFerrari tiene “ +
[Link] + “ ruedas”);
…
…
}
Una vez tenemos la clase padre y la clase hija, ésta última en su declaración debe
indicar que es hija de la clase padre y lo hace a través de:
Por lo tanto, ya podemos usar desde la clase hija cada una de las propiedades de la
clase padre siempre que la necesitemos.
187
[Link] con C#
4.6.1. Listas
Las colecciones normalmente se agrupan por tipo, aunque sin necesidad de estar
ordenadas. En otro caso:
■■ Map: un map es una lista en la que cada elemento está identificado por un valor
y una clave, ésta identifica al elemento para que sea único. Por ejemplo, una
persona tiene un valor que es su nombre y, una clave que es su DNI, el cual es
único para cada persona.
■■ Pilas: es una lista en la que los elementos se añaden al final y solo pueden ser
eliminados del final.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
188
4: Elementos de [Link]
[Link](“Nadal”);
[Link](“Federer”);
[Link](“Djokovic”);
[Link](“Murray”);
[Link](“Soderling”);
<html xmlns=”[Link]
<body>
<form id=”Form1” runat=”server”>
<asp:radiobuttonlist id=”Radio” runat=”server”> </
asp:radiobuttonlist>
</form>
</body>
</html>
En este ejemplo podemos ver cómo hemos declarado una lista de tipo String
189
[Link] con C#
4.6.2. Arrays
Un array es un conjunto de elementos con un valor cada uno de ellos y todos
pertenecientes al mismo tipo. Los arrays pueden ser de una o varias dimensiones.
Para definir un array se hace de la siguiente manera:
[Link] = [Link](0).ToString();
int n = -1;
string[] ArrayVehiculos = new string[5]
{
“Coche”, “Moto”, “Camión”, “Furgoneta”, “Sidecar”
};
do
{
n = [Link](ArrayVehiculos, “Moto”, n++);
}
while (n != [Link](ArrayVehiculos,
“Moto”));
Como podemos observar, lo primero que hacemos es declarar un entero que nos
va a servir de contador para ir recorriendo el array entero para así poder devolver el
resultado de la posición en la que se encuentra el elemento. La sentencia IndexOf
nos devuelve la posición en la que se encuentra el elemento objeto de la búsqueda,
y como puede haber más de un elemento, continuamos la búsqueda hasta el último
elemento, el cual se puede hacer a través de la llamada a LastIndexOf.
Existen varias llamadas que nos pueden ser útiles como [Link] que nos ordenará
los elementos, [Link] que nos borrará el array entero, [Link] para buscar el
elemento dentro de un array o [Link], que nos servirá para encontrar el último
elemento de los que estamos buscando.
190
4: Elementos de [Link]
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
<html xmlns=”[Link]
<body>
<form runat=”server”>
<asp:radiobuttonlist id=”Radio” runat=”server”> </
191
[Link] con C#
asp:radiobuttonlist>
</form>
</body>
</html>
Con este código pretendemos mostrar cómo se podría hacer, por ejemplo, una lista
de botones de radio con los elementos del array de vehículos ordenados. Por defecto,
la ordenación que se realiza es alfabética.
Hay que recordar que los arrays, listas, colecciones y demás elementos de este tipo
empiezan a contar desde 0. Así para el ejemplo anterior el resultado para la búsqueda
de la moto nos debe dar 1.
4.6.3. Arraylist
Un arraylist es una mejora del array, puesto que nos permite interactuar con la lista
dinámicamente, como añadiendo elementos a una lista y borrarlos de manera sencilla.
Tiene una serie de métodos asociados como:
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
192
4: Elementos de [Link]
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
}
__________________________________________________________
193
[Link] con C#
[Link] = CiudadesPrefes;
[Link]();
Tendremos como resultado lo siguiente:
Vemos que hemos eliminado de la lista a Miami y París y la hemos ordenado por orden
alfabético, y posteriormente hemos insertado en la posición 5, el elemento Estambul.
4.6.4. Sortedlist
Es otro tipo de colecciones donde se almacenan los datos con un valor y una clave
donde los elementos son ordenados por su clave. Este tipo de listas es útil cuando
tengamos que ordenar por clave, como por ejemplo, la clasificación de una liga.
using System;
using [Link];
194
4: Elementos de [Link]
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
if (!([Link]))
{
foreach (DictionaryEntry Item in Atp)
{
ListItem raqueto = new ListItem();
[Link] = [Link]();
[Link] = [Link]();
[Link](raqueto);
}
}
}
__________________________________________________________
195
[Link] con C#
<html xmlns=”[Link]
<body>
<form id = “Form1” runat = “server”>
Seleccione la posición en el ranking:
<br />
<asp:radiobuttonlist id = “Radio” runat =
“server”> </asp:radiobuttonlist>
<asp:Button ID = “Tenista” runat = “server”
Text = “Ver” Onclick = “Evento” />
<br />
Tenista: <asp:Label ID = “sel” runat =
“server” Text = “ “ />
</form>
</body>
</html>
if (!([Link]))
{
que nos evitará la repetición de los elementos una vez hayamos seleccionado uno de
ellos. Después iremos añadiendo cada uno de los elementos a nuestros botones de
radio y asociaremos a cada uno su clave y su valor.
196
4: Elementos de [Link]
4.6.5. Hashtable
Es un tipo de colecciones muy similar al SortedList con la salvedad de que no es
necesario que los objetos estén ordenados. Cada elemento tiene asociado un par
clave–valor. Como ejemplo podemos tomar el mismo que antes, pero desordenando
a los tenistas y cambiando SortedList por HashTable:
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
if (!([Link]))
{
foreach (DictionaryEntry Item in Atp)
{
ListItem raqueto = new ListItem();
[Link] = [Link]();
[Link] = [Link]();
[Link](raqueto);
}
}
197
[Link] con C#
}
protected void Evento(object sender, EventArgs args)
{
[Link] = [Link];
}
}
__________________________________________________________
<html xmlns=”[Link]
<body>
<form id = “Form1” runat = “server”>
Seleccione la posición en el ranking:
<br />
<asp:radiobuttonlist id = “Radio” runat =
“server”> </asp:radiobuttonlist>
<asp:Button ID = “Tenista” runat = “server”
Text = “Ver” Onclick = “Evento” />
<br />
Tenista: <asp:Label ID = “sel” runat =
“server” Text = “ “ />
</form>
</body>
</html>
198
4: Elementos de [Link]
4.6.6. Dictionary
Este tipo de colecciones es similar a las HashTables en las que se nos muestra una
lista de elementos con una clave y un valor y al igual que antes solo puede existir
una clave diferente para cada valor. Los valores sí se pueden repetir. A continuación
tenemos un ejemplo:
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
199
[Link] con C#
{
[Link](“Ya existe un tenista con la
clave Andy”);
}
}
}
__________________________________________________________
<html xmlns=”[Link]
<body>
<form id=”Form1” runat=”server”>
<asp:radiobuttonlist id=”Radio” runat=”server”> </
asp:radiobuttonlist>
</form>
</body>
</html>
Como podemos observar, hemos ido creando una serie de objetos con una clave y un
valor, pero en el momento en el que hemos intentado introducir otro elemento con la
misma clave que uno de los que ya había aparece un error.
200
4: Elementos de [Link]
RESUMEN
■
Las acciones en las que se vea envuelto el usuario y el servidor serán consideradas
como eventos. Un evento es la acción que realiza un usuario, el cual recibe una
respuesta a la misma.
■
En [Link] tenemos varios tipos de eventos con los que se puede interactuar, como
es pinchar un botón o pinchar dos veces sobre un botón.
■
Postback es el proceso a través del cual el navegador manda la información al servidor
diciéndole a éste que procese el evento y que cuando lo haga mande la información
resultante al navegador.
■
Un objeto es un trozo de código que realiza las tareas de un programa y que tiene la
información y capacidades necesarias para poder realizarlas. El uso de objetos en la
programación [Link] es básico.
■
Con [Link] podemos programar nuestros propios objetos como la redirección a
páginas a través de la directiva Redirect o el ciclo de vida de una sesión de usuario.
■
Existen tres tipos de relación de clases: la relación de herencia, la relación en la que una
clase usa otra clase y la relación en la que una clase contiene a la otra.
■
Las colecciones son agrupaciones de objetos del mismo tipo. Las listas, listas
ordenadas, arrays, listas de arrays, hashtables, listas ordenadas, diccionarios, etc. son
colecciones de objetos.
201
5 5
[Link] con C#
DIDÁCTICA
UNIDAD
5. [Link]
5: [Link]
ÍNDICE
ÍNDICE.......................................................................................................................................................................... 205
OBJETIVOS................................................................................................................................................................ 207
INTRODUCCIÓN....................................................................................................................................................... 208
5.1. Bases de datos.................................................................................................................................................... 209
5.2. [Link]............................................................................................................................................................... 210
5.2.1. SQL server......................................................................................................................................................... 210
5.2.2. OLE DB............................................................................................................................................................. 210
5.3. Objetos [Link]................................................................................................................................................. 212
5.3.1. Objeto Connection............................................................................................................................................... 212
5.3.2. Objeto Command y DataReader............................................................................................................................ 215
5.3.3. Objetos DataSet y DataTable................................................................................................................................. 223
5.4. Trabajando con datos.......................................................................................................................................... 226
5.4.1. Inclusión de nuevos datos con DataSet................................................................................................................... 228
5.4.2. Edición de datos con DataSet............................................................................................................................... 231
5.4.3. Eliminación de datos con DataSet.......................................................................................................................... 234
5.4.4. Tabla original con DataSet y Command................................................................................................................... 237
5.4.5. Otros métodos.................................................................................................................................................... 241
RESUMEN................................................................................................................................................................... 249
205
5: [Link]
OBJETIVOS
■ Conocer los principios básicos de las bases de datos.
■
Aprender a trabajar con bases de datos y manipular los datos a través de comandos de
[Link].
207
[Link] con C#
INTRODUCCIÓN
El uso de recursos externos es uno de los grandes De esta forma podemos entender que el uso de
fundamentos de la programación Web. Los lenguajes elementos externos a nuestro código es prácticamente
nos ofrecen una serie de funcionalidades con las que necesario para hacer de nuestra página una Web
podemos hacer casi todo lo que nos propongamos, dinámica y a la vez visual.
pero hay veces en las que la programación no lo es En este tema vamos a hacer especial hincapié en una
todo. Esto ocurre cuando tenemos que usar recursos colección de accesos a datos llamada [Link] que
situados en otro emplazamiento, como pueden ser proporciona al programador una serie de herramientas
fotografías, vídeos o simplemente el uso de elementos necesarias para el acceso, manipulación y uso de
de una base de datos. Uno de los casos más claros datos.
es cuando nos registramos en cualquier página o
nos damos de alta en una cuenta de correo nueva.
Cuando nos piden nuestros datos, no estamos más
que introduciéndolos en una base de datos. Es muy
importante este hecho, ya que a la hora de acceder
a nuestra cuenta de correo, por ejemplo, al introducir
nuestro usuario y contraseña, el servidor comprueba
en la base de datos si esos datos son coincidentes
con los que hemos metido.
208
5: [Link]
Existen muchos tipos de bases de datos, como son las bases de datos jerárquicas,
transaccionales u orientadas a objetos. Sin embargo, el tipo de base de datos más
utilizado en la actualidad son las relacionales. De forma general podemos definir
que una base de datos es una colección de datos relacionados entre ellos dentro
de un mismo contexto. Es muy importante el concepto “relacionados entre ellos”.
Cuando hablamos de esto queremos decir que en una base de datos podemos
encontrar datos primarios y datos secundarios, denominados clave. Por ejemplo,
supongamos una muestra de población de 50000 personas. Si ponemos a comparar
los nombres de las personas probablemente obtengamos nombres repetidos, así
como si comparamos ciertos datos de las personas, pero para distinguir lógicamente
hablando a dos personas, la única forma puede ser a través del DNI. No pueden existir
dos personas con un mismo DNI, así que podemos hablar de que este dato es una
clave primaria. En otras palabras, podemos decir que una clave primaria es aquella
que identifica de manera única a un elemento de una base de datos. El resto de datos
que identifiquen a una persona estarán relacionados con su clave primaria.
209
[Link] con C#
5.2. [Link]
[Link] (ActiveX Data Object) es el nombre que se le da a un grupo de componentes
software proporcionados por el Framework de .NET usados por los programadores
para acceder a datos y a servicios de datos en sistemas gestores de bases de datos
relacionales.
Para poder acceder a los datos de una base de datos necesitamos una interfaz que
haga de intermediaria entre ésta y el usuario. En [Link] se incluyen una serie de
proveedores y la que usa [Link] es OLE DB y los drivers ODBC que son mecanismos
genéricos para interactuar con las bases de datos.
5.2.2. OLE DB
OLE DB son las siglas para Object Linking and Embedding for Databases que viene
a significar “Enlaces de datos e inserción de datos en las bases de datos”, la cual ha
sido creada por Microsoft para tener acceso a los datos de manera regular.
210
5: [Link]
OLE DB pertenece a los componentes para accesos a datos creado por Microsoft
para interactuar con los programadores y ofrece una ayuda casi indispensable a la
hora de poder acceder a los datos. Gracias al namespace “[Link]” que
es el proveedor de datos de .NET para OLE DB podemos acceder a un origen de
datos en el espacio administrado. Existen una gran variedad de clases cada una con
una funcionalidad distinta a la hora de interactuar con datos y así facilitar la labor del
programador.
211
[Link] con C#
Vamos a entrar en detalle en cada uno de los objetos nombrados y ver cuál es su uso.
Dependiendo del proveedor que usemos, tendremos que usar una directiva u otra.
Evidentemente no podemos nombrar todos los proveedores existentes, pero sí
podemos nombrar las directivas más usuales.
Para OLEDB cuando se llama a una base de datos SQL Server tendríamos la siguiente
directiva:
Vamos a realizar un ejemplo en el que hagamos uso de estas directivas. Para empezar
vamos a buscar dentro de la siguiente ruta:
212
5: [Link]
[Link]
Podemos observar en Microsoft Access (un uso más sencillo, ya que sólo con el ratón
vamos a poder movernos por dentro de la tabla) las tablas que contiene dicho ejemplo,
aunque posteriormente vayamos a utilizar Microsoft Visual Studio para cualquier tipo
de gestión con la base de datos.
Ahora pinchamos sobre cualquiera de las siguientes tablas. Vamos a elegir por ejemplo
la de clientes (customers) y obtendremos una tabla con el resultado de los clientes.
Aquí presentamos una pequeña muestra de la tabla.
213
[Link] con C#
“Select * from Customers” que nos indica que queremos seleccionar todas las entradas
existentes para “customers”.
<configuration>
<connectionStrings>
<add name=”ConnectionString”
connectionString=”data source=.\
SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|Dat
aDirectory|\[Link];User Instance=true”
providerName=”[Link]” />
</connectionStrings>
<[Link]>
<compilation debug=”true” targetFramework=”4.0” />
<authentication mode=”Forms”>
<forms loginUrl=”~/Account/[Link]”
timeout=”2880” />
</authentication>
...
</configuration>
Observamos que tenemos un trozo de código que nos permite configurar los
parámetros necesarios para poder realizar la conexión correctamente, en el bloque
de connectionStrings, en el cual tenemos que indicar un nombre y la ruta a la que
queremos acceder. Estos parámetros de configuración van a variar según el origen de
la base de datos y bajo la tecnología en la que se ha construido la misma.
214
5: [Link]
<connectionStrings>
<add name=”ConnectionString”
connectionString=”data source=.\
SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|Dat
aDirectory|\[Link];User Instance=true”
providerName=”[Link]” />
</connectionStrings>
No nos basta solo con estas cuatro palabras para hacer consultas en la tabla. También
vamos a usar From para elegir dónde queremos que se actúe con los datos y Where
para explicar la condición.
Vamos a aprender a gestionar las bases de datos desde Microsoft Visual Studio. Para
ello vamos a usar los ficheros descargados por el alumno. A continuación, vamos a
acceder a la carpeta contenedora del nuevo proyecto, para lo cual podemos llegar
copiando la ruta. Posteriormente, vamos a entrar en la carpeta descargada y copiamos
el fichero NORTHWND de tipo .MDF. Copiaremos estos ficheros y las pegaremos en
nuestro proyecto en la carpeta APP_DATA. Una vez realizado este paso, vamos a
volver a Visual Studio y actualizamos el proyecto, que se realizará en el explorador de
soluciones, pulsando sobre el botón de mostrar todos los archivos. También podemos
hacer este paso pulsando con el botón derecho sobre App_Data y darle a añadir un
elemento existente y buscar la ubicación de la base de datos. Podemos observar
como aparecen las nuevas carpetas añadidas, por lo tanto, ya podemos acceder a la
base de datos y realizar operaciones con ellas.
215
[Link] con C#
Vamos a realizar nuestro primer ejemplo para el cual (y todos los siguientes en la
unidad) vamos a tener que usar dos namespaces nuevos:
using [Link];
using [Link];
Así ya vamos a poder realizar las conexiones con la base de datos a través de
instrucciones SQL.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
216
5: [Link]
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
[Link] = resultado;
}
catch (Exception exc)
{
[Link] = “Algo hemos hecho mal. Error en
la conexion. <br />”;
[Link] = [Link]();
}
217
[Link] con C#
finally
{
[Link]();
[Link]();
[Link] = “Ya se ha cerrado la conexión
tras haberla abierto bien. <br />”;
}
}
}
__________________________________________________________
<html xmlns=”[Link]
<head>
<title> Control de errores </title>
</head>
<body>
Además vamos a tener que realizar una serie de modificaciones sobre el fichero Web.
config. Es en este fichero donde vamos a tener que realizar la conexión con la base de
datos a través del siguiente bloque:
<connectionStrings>
<add name=”ConnectionString”
connectionString=”Data Source=.\SQLEXPRESS;At
tachDbFilename=|DataDirectory|\[Link];Integrated
Security=True;User Instance=True”
providerName=”[Link]”/>
</connectionStrings>
218
5: [Link]
<configuration>
<connectionStrings>
<add name=”ConnectionString”
connectionString=”Data Source=.\SQLEXPRESS;At
tachDbFilename=|DataDirectory|\[Link];Integrated
Security=True;User Instance=True”
providerName=”[Link]”/>
</connectionStrings>
...
</configuration>
Como se puede observar, hemos tomado el código del primer ejemplo y hemos
añadido ciertas líneas. Las líneas principales serían en las que se hace la consulta, en
las que primero definimos la consulta y luego desde SQLCommand se hace la llamada
a esa consulta.
El resto del código es similar al anterior y como conclusión a nuestra consulta debemos
obtener los siguientes resultados:
219
[Link] con C#
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
220
5: [Link]
[Link][“ConnectionString”].
ToString());
SqlCommand comando = new SqlCommand(consulta,
objeto);
try
{
[Link]();
[Link] = “Hemos realizado bien la
conexión. <br />”;
[Link] = comando.
ExecuteReader([Link]);
[Link]();
}
catch (Exception exc)
{
[Link] = “Algo hemos hecho mal. Error en
la conexion. <br />”;
[Link] = [Link]();
}
finally
{
[Link]();
[Link] = “Ya se ha cerrado la conexión
tras haberla abierto bien. <br />”;
}
}
________________________________________________________
221
[Link] con C#
[Link]”>
<html xmlns=”[Link]
<head>
<title> Control de errores </title>
</head>
<body>
Comprobando la conexión
<b> <asp:Label ID = “datos” runat = “server”> </
asp:Label></b> <br />
<br />
<asp:Label ID = “abrir” runat = “server”> </asp:Label>
<asp:datagrid ID = “tablita”
runat = “server” CellPadding = “2”
HeaderStyle-BackColor = “black”
HeaderStyle-ForeColor = “white” />
<asp:Label ID = “cerrar” runat = “server”> </
asp:Label>
</body>
</html>
Aquí hemos incluido los datos dentro de una tabla para una mayor atracción visual.
El código apenas cambia, puesto que en vez de recorrer todos los datos uno a uno
hemos decidido abrir la conexión e ir recogiéndolos a través de DataSource y DataBind.
Como conclusión hemos obtenido una tabla con los resultados de las ciudades y sus
códigos postales de la tabla de clientes:
222
5: [Link]
Aquí tenemos un ejemplo del código que hay que utilizar para obtener el mismo
resultado que anteriormente:
223
[Link] con C#
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
<html xmlns=”[Link]
<head>
224
5: [Link]
</html>
225
[Link] con C#
DataGrid es más llamativo visualmente hablando, pero DataSet tiene la ventaja de que
puede trabajar con varias tablas a la vez.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
226
5: [Link]
[Link] = objdat;
[Link]();
[Link] = objdat2;
[Link]();
DataTable tabla = [Link][“Customers”];
DataTable tabla2 = [Link][“Employees”];
}
}
__________________________________________________________
<html xmlns=”[Link]
<head>
<title> Control de errores </title>
</head>
<body>
Comprobando la conexión
<b> <asp:Label ID = “datos” runat = “server”> </
asp:Label></b> <br />
<br />
<asp:Label ID = “abrir” runat = “server”> </asp:Label>
<asp:datagrid ID = “lista”
runat = “server” CellPadding = “2”
HeaderStyle-BackColor = “black”
HeaderStyle-ForeColor = “white” />
<asp:datagrid ID = “lista2”
runat = “server” CellPadding = “2”
HeaderStyle-BackColor = “black”
HeaderStyle-ForeColor = “white” />
<asp:Label ID = “cerrar” runat = “server”> </
asp:Label>
</body>
</html>
227
[Link] con C#
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
228
5: [Link]
using [Link];
<html xmlns=”[Link]
<head>
<title> Control de errores </title>
</head>
<body>
<asp:Label ID = “datos” runat = “server”> </asp:Label>
<asp:Label ID = “abrir” runat = “server”> </asp:Label>
229
[Link] con C#
<table>
<tr>
<td> Tabla Inicial</td>
<td> Tabla Nueva </td>
</tr>
<tr>
<td valign = “top”>
<asp:DataGrid ID = “lista” runat = “server”
CellPadding = “2”
HeaderStyle-BackColor = “black”
HeaderStyle-ForeColor = “white”>
</asp:DataGrid>
</td>
<td valign = “top”>
<asp:DataGrid ID = “nuevafila” runat = “server”
CellPadding = “2”
HeaderStyle-BackColor = “black”
HeaderStyle-ForeColor = “white”>
</asp:DataGrid>
</td>
</tr>
</table>
<asp:Label ID = “cerrar” runat = “server”> </
asp:Label>
</body>
</html>
230
5: [Link]
Como podemos ver, hemos añadido un nuevo registro de la siguiente forma. Nos
hemos declarado una nueva variable fila de tipo DataRow, que llama a un elemento
DataTable y se crea un nuevo elemento. Posteriormente, hemos creado un nuevo
registro con los datos nuevos y añadimos a nuestra tabla la fila nueva:
[Link](fila);
[Link] = [Link];
[Link]();
}
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
231
[Link] con C#
using [Link];
[Link] = [Link];
[Link]();
// Fin de la parte nueva del código
}
}
__________________________________________________________
232
5: [Link]
<html xmlns=”[Link]
<head>
<title> Control de errores </title>
</head>
<body>
<asp:Label ID = “datos” runat = “server”> </asp:Label>
<asp:Label ID = “abrir” runat = “server”> </asp:Label>
<table>
<tr>
<td> Tabla Inicial</td>
<td> Tabla Nueva </td>
<td> Tabla Modificada </td>
</tr>
<tr>
<td valign = “top”>
<asp:DataGrid ID = “lista” runat = “server”
CellPadding = “2”
HeaderStyle-BackColor = “black”
HeaderStyle-ForeColor = “white”>
</asp:DataGrid>
</td>
<td valign = “top”>
<asp:DataGrid ID = “nuevafila” runat = “server”
CellPadding = “2”
HeaderStyle-BackColor = “black”
HeaderStyle-ForeColor = “white”>
</asp:DataGrid>
</td>
<td valign = “top”>
<asp:DataGrid ID = “nuevafilamod” runat =
“server”
CellPadding = “2”
HeaderStyle-BackColor = “black”
HeaderStyle-ForeColor = “white”>
</asp:DataGrid>
</td>
</tr>
</table>
233
[Link] con C#
</html>
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
234
5: [Link]
[Link] = [Link];
[Link]();
// Parte nueva del código.
[Link][9].Delete();
[Link] = [Link];
[Link]();
}
}
__________________________________________________________
235
[Link] con C#
<html xmlns=”[Link]
<head>
<title> Control de errores </title>
</head>
<body>
<asp:Label ID = “datos” runat = “server”> </asp:Label>
<asp:Label ID = “abrir” runat = “server”> </asp:Label>
<table>
<tr>
<td> Tabla Inicial</td>
<td> Tabla Nueva </td>
<td> Tabla Modificada </td>
<td> Fila eliminada </td>
</tr>
<tr>
<td valign = “top”>
<asp:DataGrid ID = “lista” runat = “server”
CellPadding = “2”
HeaderStyle-BackColor = “black”
HeaderStyle-ForeColor = “white”>
</asp:DataGrid>
</td>
<td valign = “top”>
<asp:DataGrid ID = “nuevafila” runat = “server”
CellPadding = “2”
HeaderStyle-BackColor = “black”
HeaderStyle-ForeColor = “white”>
</asp:DataGrid>
</td>
<td valign = “top”>
<asp:DataGrid ID = “nuevafilamod” runat =
“server”
CellPadding = “2”
HeaderStyle-BackColor = “black”
HeaderStyle-ForeColor = “white”>
</asp:DataGrid>
236
5: [Link]
</td>
<td valign = “top”>
<asp:DataGrid ID = “filaelim” runat = “server”
CellPadding=”2”
HeaderStyle-BackColor = “black”
HeaderStyle-ForeColor = “white”>
</asp:DataGrid>
</td>
</tr>
</table>
<asp:Label ID = “cerrar” runat = “server”> </
asp:Label>
</body>
</html>
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
237
[Link] con C#
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
[Link] = [Link];
[Link]();
[Link][9].Delete();
[Link] = [Link];
[Link]();
238
5: [Link]
<html xmlns=”[Link]
<head>
<title> Control de errores </title>
</head>
<body>
<asp:Label ID = “datos” runat = “server”> </asp:Label>
<asp:Label ID = “abrir” runat = “server”> </asp:Label>
<table>
<tr>
<td> Tabla Inicial</td>
<td> Tabla Nueva </td>
<td> Tabla Modificada </td>
<td> Fila eliminada </td>
239
[Link] con C#
</tr>
<tr>
<td valign = “top”>
<asp:DataGrid ID = “lista” runat = “server”
CellPadding = “2”
HeaderStyle-BackColor = “black”
HeaderStyle-ForeColor = “white”>
</asp:DataGrid>
</td>
<td valign = “top”>
<asp:DataGrid ID = “nuevafila” runat = “server”
CellPadding = “2”
HeaderStyle-BackColor = “black”
HeaderStyle-ForeColor = “white”>
</asp:DataGrid>
</td>
<td valign = “top”>
<asp:DataGrid ID = “nuevafilamod” runat =
“server”
CellPadding = “2”
HeaderStyle-BackColor = “black”
HeaderStyle-ForeColor = “white”>
</asp:DataGrid>
</td>
<td valign = “top”>
<asp:DataGrid ID = “filaelim” runat = “server”
CellPadding = “2”
HeaderStyle-BackColor = “black”
HeaderStyle-ForeColor = “white”>
</asp:DataGrid>
</td>
</tr>
</table>
<asp:DataGrid id = “original” runat = “server”
CellPadding = “2”
HeaderStyle-BackColor = “black”
HeaderStyle-ForeColor = “white”>
</asp:DataGrid>
<asp:Label ID = “cerrar” runat = “server”> </
asp:Label>
</body>
</html>
240
5: [Link]
Como vemos, hemos utilizado cuatro comandos para actualizar nuestra tabla:
UpdateCommand, InsertCommand, DeleteCommand y Update. Posteriormente,
hemos realizado la conexión con la base de datos y luego la hemos cerrado.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
241
[Link] con C#
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
242
5: [Link]
ToString());
SqlCommand comando = new SqlCommand(consulta,
connection);
SqlDataReader lector = null;
try
{
[Link]();
[Link] = “Hemos realizado bien la
conexión. <br />”;
lector = [Link]();
while ([Link]() == true)
{
resultado += lector[“FirstName”];
resultado += “ ”;
resultado += “<br />”;
}
[Link] = resultado;
}
catch (Exception exc)
{
[Link] = “Algo hemos hecho mal. Error en
la conexion. <br />”;
[Link] = [Link]();
}
finally
{
[Link]();
[Link]();
[Link] = “Ya se ha cerrado la conexión
tras haberla abierto bien. <br />”;
}
}
}
using System;
using [Link];
using [Link];
using [Link];
using [Link];
243
[Link] con C#
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
try
{
[Link]();
[Link] = “Hemos realizado bien la
conexión. <br />”;
int id;
if ([Link]([Link]().
ToString(), out id))
{
[Link] = “El numero de empleados es “
+ id + “<br />”;
}
}
catch (SqlException ex)
{
[Link] = [Link]();
}
finally
{
[Link]();
244
5: [Link]
<html xmlns=”[Link]
<head>
<title> Control de errores </title>
</head>
<body>
Comprobando la conexión...
<br />
Tanto para un método como para el otro es necesario que la conexión con la base de
datos esté abierta.
245
[Link] con C#
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
246
5: [Link]
{
resultado += lector[“City”];
resultado += “ ”;
resultado += “<br />”;
}
[Link]();
[Link] = resultado;
}
catch (Exception exc)
{
[Link] = “Algo hemos hecho mal. Error en
la conexion. <br />”;
[Link] = [Link]();
}
finally
{
[Link]();
[Link]();
[Link] = “Ya se ha cerrado la conexión
tras haberla abierto bien. <br />”;
}
}
}
__________________________________________________________
<html xmlns=”[Link]
<head>
<title> Control de errores </title>
</head>
<body>
Comprobando la conexión...
<br />
247
[Link] con C#
248
5: [Link]
RESUMEN
■
Las bases de datos son colecciones de datos en las que podemos insertar datos,
eliminarlos, modificarlos o simplemente acceder a ellos para consultarlos.
■
Tenemos varios tipos de proveedores de datos, como proveedores para SQL o
proveedores para OLE DB.
■
Tenemos varios objetos [Link] para poder realizar una conexión y manipular datos
de una base de datos. Dichos objetos son Connection, Command, DataReader,
DataSet y DataTable.
■
Se puede trabajar con datos de forma conectada y desconectada. En ambos casos
se pueden manipular datos a través de cualquiera de las cuatro acciones nombradas.
La diferencia de hacerlo de forma conectada a forma desconectada, es que mientras
estamos conectados los demás usuarios que accedan a la tabla pueden ver los
cambios en tiempo de ejecución, mientras que si lo hacemos de forma desconectada
hay que subir los datos a través de una conexión.
249
6
[Link] con C#
6
DIDÁCTICA
UNIDAD
ÍNDICE
ÍNDICE.......................................................................................................................................................................... 253
OBJETIVOS................................................................................................................................................................ 255
INTRODUCCIÓN....................................................................................................................................................... 256
6.1. Controles HTML y de usuario............................................................................................................................. 257
6.1.1. Controles HTML.................................................................................................................................................. 257
6.1.2. Controles de usuario............................................................................................................................................ 258
6.2. Controles de servidor [Link]........................................................................................................................... 262
6.2.1. Detección automática del navegador...................................................................................................................... 262
6.2.2. Eliminación automática de la detección del navegador.............................................................................................. 262
6.2.3. Eventos y modelado de objetos............................................................................................................................. 263
6.2.4. Propiedades....................................................................................................................................................... 264
6.3. Ciclo de vida de una página [Link]................................................................................................................. 265
6.3.1. Page_Load........................................................................................................................................................ 265
6.3.2. Manejo de eventos.............................................................................................................................................. 265
6.3.3. Page_Unload...................................................................................................................................................... 265
6.4. Tipos de controles en [Link]........................................................................................................................... 276
6.4.1. Controles intrínsecos............................................................................................................................................ 276
6.4.2. Controles rich..................................................................................................................................................... 276
6.4.3. Controles de validación........................................................................................................................................ 279
6.4.4. Controles de interpretación................................................................................................................................... 280
6.5. Code-Behind........................................................................................................................................................ 293
6.6. Ciclo de vida de una página [Link]................................................................................................................. 296
6.6.1. Páginas que utilizan Web parts.............................................................................................................................. 296
6.6.2. Creación de Web parts individuales........................................................................................................................ 296
6.6.3. Creación de aplicaciones completas....................................................................................................................... 297
RESUMEN................................................................................................................................................................... 311
253
6: Controles Web con [Link]
OBJETIVOS
■ Aprender los tipos de controles que existen para programar.
■
Conocer y saber usar los distintos tipos de controles que existen. Vamos a ver los controles
HTML, los controles de usuario y los propios de la tecnología [Link].
■ Saber cuáles son las ventajas y propiedades del uso de los controles [Link].
■
Aprender los distintos tipos de controles que existen en [Link], cómo usarlos, cuándo
usarlos y cuáles son sus propiedades.
■
Aprender algunas técnicas de programación que mejoren nuestras prestaciones y que
aumenten en eficiencia. En esta ocasión aprenderemos a usar la técnica Code-Behind.
■
Aprender a programar usando la mayoría de los tipos de controles de usuario y ampliar
conocimientos en HTML.
■
Profundizar en la personalización de las páginas Web y saber utilizar los controles de Visual
Studio para su implementación.
255
[Link] con C#
INTRODUCCIÓN
Ya en la unidad 2 empezamos a familiarizarnos con los Además de todo esto, debemos conocer distintas
controles Web [Link], que como podemos recordar, técnicas de programación para mejorar nuestro
nos ayudan a darle mayor dinamismo a nuestra página. código, nuestra eficiencia y la elegancia del código.
Vimos, entre otros, controles para formularios y durante Dentro de este marco incluimos la técnica Code-
esta unidad ampliaremos nuestros conocimientos Behind que veremos al final del tema, que es una
sobre los controles Web. Además de los controles técnica que separa lo que es código HTML y ASP.
Web [Link], también podemos encontrarnos con NET y lo que es código C#.
controles HTML y controles de usuario.
El uso de controles es una gran ventaja a la hora de
programar con [Link], ya que obtenemos gran
abstracción del código y conseguimos muchas
funcionalidades que nos van a ser útiles. Hay
varios tipos de controles y cada uno de ellos nos
proporcionará un uso distinto y nos permitirá tener una
página dinámica, sin errores y limpia. Es importante
saber cuándo se van a usar los controles.
256
6: Controles Web con [Link]
El hecho de que esto sea programable es que gracias a la referencia que hacemos
en runat = ”server”, nos aseguramos que el Framework .NET convertirá una etiqueta
HTML en un objeto. Una condición básica es que las etiquetas estén correctamente
cerradas y dentro de su estructura.
HTML tiene sus propios controles para definir sus características. Dentro de ellas
podemos encontrarnos con las siguientes:
■■ Los valores que un usuario puede dar en un formulario, cuando son enviados al
servidor, se mantienen.
A modo de resumen podemos decir, que para pasar una página de control de HTML a
un control de servidor HTML, nos basta con añadir a la etiqueta la característica runat
=”server” y que el identificador que le demos sea único.
257
[Link] con C#
Es importante decir que podemos usar controles HTML o [Link] a nuestro gusto,
incluso mezclarlos cuando nos convenga.
Fichero .[Link]:
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
258
6: Controles Web con [Link]
}
}
Fichero .ascx:
Con este control hemos definido un control de usuario en el que hemos definido un
propio estilo, el cual tiene ciertos aspectos que nosotros hemos creado. Podemos
definir que hemos inventado un patrón, el cual puede ser usado por los usuarios.
A continuación vamos a crear un fichero .aspx, con su respectivo fichero .[Link] para
poder usar nuestro control de usuario.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
259
[Link] con C#
if (!([Link]))
{
}
public void click(Object o, EventArgs args)
{
string col = [Link];
[Link] = col;
}
}
__________________________________________________________
<html xmlns=”[Link]
<head runat=”server”>
<title>Control de Usuario</title>
</head>
<body>
<form id=”Form1” runat = “server” method = “post”>
<control:entrada ID = “usuario” runat = “server” />
Elija un color
<br />
<asp:DropDownList ID = “lista” runat = “server”>
</asp:DropDownList>
<asp:Button ID=”Button1” Text = “Cambie la cabecera”
OnClick = “click” runat = “server” />
260
6: Controles Web con [Link]
Con la primera línea estamos definiendo una nueva etiqueta, la cual usa el
control de usuario que hemos creado. Esta etiqueta será de la siguiente forma:
<TagPrefix:TagName …> el resto del código nos resulta familiar y los aspectos de
diseño se resolverán más adelante. El resultado como era de esperar es una página
en la que podemos cambiar de color nuestra cabecera de la página al elegir un color
de la lista.
Esta característica se puede apreciar en muchas páginas en las que uno puede definir
su fondo de pantalla, por ejemplo, en la cuenta de usuario de Gmail cada uno puede
definir el tema de su fondo de pantalla.
261
[Link] con C#
Hay que decir que evidentemente en páginas simples, la diferencia apenas se nota.
Si representamos un Web form simple, no vamos a notar diferencias, sin embargo, si
representamos una página compleja sí se puede notar alguna diferencia entre distintos
exploradores. Esta característica también se puede anular.
<clientTarget>
<add alias=”ie5” userAgent=”Mozilla/4.0 (compatible;
MSIE 5.5; Windows NT 4.0” />
<add alias=”ie4” userAgent=”Mozilla/4.0 (compatible;
MSIE 4.0; Windows NT 4.0” />
<add alias=”uplevel” userAgent=”Mozilla/4.0
(compatible; MSIE 5.5; Windows NT 5.1)” />
<add alias=”downlevel” userAgent=”Generic Downlevel”
/>
</clientTarget>
262
6: Controles Web con [Link]
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
}
__________________________________________________________
<html xmlns=”[Link]
263
[Link] con C#
<head runat=”server”>
<title>Control de Usuario</title>
</head>
<body>
<form id = “horita” method = “post” runat = “server”>
<asp:button id = “BotonHora” runat = “server” text =
“¿Qué hora es?” onclick = “Hora” />
</form>
</html>
6.2.4. Propiedades
Algunas de las propiedades [Link] son las siguientes:
■■ Height y Width: sirven para darle anchura y altura en píxeles a los controles.
Hay muchas más características que pueden tomar los controles, pero solo hemos
nombrado las más importantes. También podemos darle anchura a las letras,
ponerlas en negrita, darle formato a los bordes de los botones, etcétera. Para ampliar
conocimientos sobre estas características es recomendable visitar la documentación
de SDK.
264
6: Controles Web con [Link]
6.3.1. Page_Load
Es un método de la clase Page. Este método es invocado cuando la página se carga
por primera vez o cuando es actualizada. Ya sabemos perfectamente cómo se usa
este método:
6.3.3. Page_Unload
Este método es el contrario a Page_Load. Con Page_Unload lo que intentamos es
cerrar elementos abiertos antes de cerrar la página, como por ejemplo cerrar ficheros,
desconectarnos de una base de datos. Este método se usa de la siguiente forma:
Es cierto que el uso de este método puede provocar problemas de rendimiento, por
lo que conviene cerrar las bases de datos en el mismo método en las que se esté
usando.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
265
[Link] con C#
using [Link];
}
protected void ConfirmarPista(object o, EventArgs args)
{
if (!([Link]))
{
return;
}
String horapartido, pistapartido;
horapartido = [Link];
pistapartido = [Link];
[Link] = [Link];
[Link] = “Ya tiene reservada su pista a
las “ + horapartido
+ “ en la pista “ + pistapartido;
}
}
__________________________________________________________
<html xmlns=”[Link]
<head>
<title> Unidad 6 </title>
</head>
<body>
<h3> Alquiler pista Pádel </h3>
<form id=”padel” method =”post” runat=”server”>
266
6: Controles Web con [Link]
</asp:Panel>
<p>
<asp:Button ID = “botonaceptar” runat =
“server” Text = “Confirmar” OnClick = “confirmarPista” />
</p>
<p>
<asp:Label ID = “mensajeconf” runat = “server”
BackColor = “Gray” Font-Bold = “true”
Text = “Escoja una pista, una hora y
267
[Link] con C#
confirme” />
</p>
</form>
</body>
</html>
268
6: Controles Web con [Link]
Después de elegir una pista y una hora, le damos al botón de confirmar y nos debería
salir algo parecido a lo siguiente:
Como podemos observar, es un código que es asequible a estas alturas del curso. Ya
hemos visto la mayoría de los elementos que aparecen en este código, aunque sí es
verdad que hay algunos nuevos. Vamos a empezar por los comandos nuevos que hay
en la parte del HTML. Por primera vez aparecen algunas propiedades de las que hemos
visto antes como son Width y Height o BackColor. También aparece en este ejemplo
la opción para obligar a rellenar un campo. Esta etiqueta es la RequiredFieldValidator,
que aunque en este ejemplo no nos sirva de mucho porque tenemos una lista en la que
por defecto ya tenemos una opción seleccionada, sí nos va a servir para el próximo
ejemplo. En esta etiqueta tenemos que indicar qué error se debe mostrar a través
del comando ErrorMessage y cuál es el campo que queremos que sea obligatorio
a través del comando ControlToValidate. Para hacer la comprobación tenemos que
usar la etiqueta CustomValidator y dentro de ésta se usa el OnServerValidate, que
nos sirve para ver en qué método se debe hacer esta comprobación. Como ya hemos
visto antes, en estos momentos no hace falta.
Si pasamos a la parte de los métodos, tenemos uno que sirve para validar la pista, el
cual usaremos en el siguiente ejemplo, en el que hemos puesto que los argumentos
estén a true para que los cambios que hagamos puedan hacerse correctamente y
después, tenemos un nuevo método que hará posible que modifiquemos la etiqueta
que tenemos en la parte inferior de nuestro navegador.
Veamos ahora un ejemplo en el que en vez de tener una lista desplegable tengamos
que rellenar nosotros mismos esos campos. En esta ocasión sí vamos a hacer uso de
los campos requeridos:
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
269
[Link] con C#
using [Link];
using [Link];
using [Link];
using [Link];
try
{
fecharec = [Link]([Link]);
}
catch (Exception e1)
{
[Link] = “Introduzca la fecha con el
siguiente formato: DD/MM/YYYY “ +
“ en el campo fecha de recogida.”;
return;
}
try
{
fechadev = [Link](fechadevolucion.
Text);
}
catch (Exception e2)
{
[Link] = “Introduzca la fecha con el
siguiente formato: DD/MM/YYYY “ +
“ en el campo fecha de devolución.”;
return;
}
270
6: Controles Web con [Link]
[Link] = true;
}
protected void confirmarCoche(object o, EventArgs args)
{
if (!([Link]))
{
return;
}
DateTime fecharec, fechadev;
String cocherec, lugarrec;
cocherec = [Link];
lugarrec = [Link];
fecharec = [Link]([Link]);
fechadev = [Link]([Link]);
[Link] = [Link];
[Link] = “Ya tiene reservada su coche
del modelo: “ + cocherec
+ “ y lo debe recoger en: “ + lugarrec + “<br
/>” + “ Su alquiler va desde el “
+ [Link]() + “ hasta el “
+ [Link]();
}
}
__________________________________________________________
<html xmlns=”[Link]
<head>
271
[Link] con C#
272
6: Controles Web con [Link]
ControlToValidate = “fechadevolucion”
/>
<br />
<asp:CustomValidator ID = “validacion” runat =
“server”
ControlToValidate = “fecharecogida”
OnServerValidate = “validacioncoche” />
</asp:Panel>
<p>
<asp:Button ID = “botonaceptar” runat =
“server” Text = “Confirmar” OnClick = “confirmarCoche” />
</p>
<p>
<asp:Label ID = “mensajeconf” runat = “server”
BackColor = “Gray” Font-Bold = “true”
Text = “Escoja un coche, un sitio de
recogida, la fecha de recogida y la de devolución.” />
</p>
</form>
</body>
</html>
Como podemos ver aquí, hemos hecho uso de los campos requeridos en los de fecha
de recogida y en los de fecha de devolución. Veamos una imagen del resultado que
obtendríamos una vez le damos al botón aceptar con esos campos vacíos:
273
[Link] con C#
En primer lugar es que la fecha de recogida debe ser posterior a la fecha actual:
Ahora veamos que la fecha de devolución sea posterior a la fecha de recogida del
coche:
274
6: Controles Web con [Link]
Vamos a ver que en el campo fecha no ponemos ninguno de los formatos soportados
por [Link]:
275
[Link] con C#
■■ ImageButton: nos muestra una imagen sobre la que se puede pulsar y acceder
a ella.
En Microsoft Visual Studio cuando estamos creando un nuevo sitio Web tenemos
la posibilidad de incluir los controles anteriores y los intrínsecos de manera manual
gracias a la pestaña que aparece a la derecha de la pantalla:
276
6: Controles Web con [Link]
Aquí simplemente tenemos que pulsar sobre el control que queramos incluir y
arrastrarlo hasta la zona de código donde queramos que aparezca.
277
[Link] con C#
Se pueden hacer algunas mejoras sobre el calendario, como elegir el día en el que
se empieza, ya que por ejemplo, en algunos países se empieza a contar desde el
domingo y en otros como España desde el lunes.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
278
6: Controles Web con [Link]
<html xmlns=”[Link]
<head>
<title> Unidad 6 </title>
</head>
<body>
<form id=”form1” runat=”server”>
Para hacer nuestro curso en [Link] visite nuestra
página Web:
<asp:LinkButton ID=”LinkButton1” runat=”server”
OnClick = “click” > Seas, estudios superiores abiertos
</asp:LinkButton>
</form>
</body>
</html>
279
[Link] con C#
■■ DataGrid: sirve para dibujar varias columnas e introducir datos dentro de sus
celdas.
■■ Repeater: con este control podemos hacer repetir el valor de una fila en el resto
de filas correspondientes.
Gracias a un magnífico sorteo que se ha realizado entre los estudiantes del curso ASP.
NET, al ganador le ha tocado un viaje “Round the World” para dar la vuelta al mundo.
Como es un tanto complejo y con todas las escalas que hacemos, nos resulta casi
imposible acordarnos cuando tenemos los vuelos, así que para ello nos creamos un
calendario.
Para usar el calendario hemos tenido que incluir los datos del viaje en un fichero .xml
con el siguiente código:
<Ruta>
<Event>
<ShortDesc> 1º vuelo: Madrid - Dubai </ShortDesc>
<DetailDesc> Vuelo directo Round the World. 6 días en
destino </DetailDesc>
<EventDate> 01/01/2011 </EventDate>
<StartTime> 08.00 </StartTime>
<EndTime> 11.00 </EndTime>
</Event>
<Event>
<ShortDesc> 2º vuelo: Dubai - Katmandú </ShortDesc>
<DetailDesc> Vuelo directo Round the World. 5 días en
destino </DetailDesc>
<EventDate> 01/07/2011 </EventDate>
<StartTime> 09.00 </StartTime>
<EndTime> 13.00 </EndTime>
</Event>
<Event>
280
6: Controles Web con [Link]
281
[Link] con C#
282
6: Controles Web con [Link]
destino </DetailDesc>
<EventDate> 03/21/2011 </EventDate>
<StartTime> 01.00 </StartTime>
<EndTime> 10.00 </EndTime>
</Event>
<Event>
<ShortDesc> 14º vuelo: Marrakech - Madrid </ShortDesc>
<DetailDesc> Vuelo directo Round the World. Fin de
trayecto </DetailDesc>
<EventDate> 03/27/2011 </EventDate>
<StartTime> 09.00 </StartTime>
<EndTime> 11.00 </EndTime>
</Event>
</Ruta>
Es muy importante el detalle de las fechas. Las fechas deben usarse como se hace en
el sistema sajón: MM/DD/YYYY.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
283
[Link] con C#
284
6: Controles Web con [Link]
[Link] = [Link].
FromName(“Gray”);
}
else
{
if ([Link])
{
[Link] = [Link].
[Link](“#F2F5A9”);
}
else
{
[Link] = [Link].
[Link](“White”);
}
}
DataSet calendario = VerRuta();
if (calendario == null)
{
return;
}
foreach (DataRow zRow in [Link][0].
Rows)
{
DateTime compareDate =
GetFecha(zRow[“EventDate”].ToString());
if (compareDate == [Link])
{
MuestraCalendario obj = new
MuestraCalendario();
[Link] = zRow[“ShortDesc”].
ToString();
[Link] = zRow[“DetailDesc”].
ToString();
[Link] = zRow[“StartTime”].
ToString();
[Link] = zRow[“EndTime”].ToString();
Label lab = new Label();
[Link] = “<br />” + [Link];
[Link](lab);
}
}
}
protected void VerDetalle()
285
[Link] con C#
{
DateTime dt = [Link];
DataSet ds = VerRuta();
if (ds == null)
{
return;
}
ArrayList obj = new ArrayList();
foreach (DataRow zRow in [Link][0].Rows)
{
DateTime compareDate =
GetFecha(zRow[“EventDate”].ToString());
if (compareDate == dt)
{
MuestraCalendario mc = new
MuestraCalendario();
[Link] = dt;
[Link] = zRow[“ShortDesc”].
ToString();
[Link] = zRow[“DetailDesc”].
ToString();
[Link] = zRow[“StartTime”].
ToString();
[Link] = zRow[“EndTime”].ToString();
[Link](mc);
}
}
[Link] = obj;
[Link]();
if ([Link] > 0)
{
[Link] = true;
[Link] = “Viajes en esta fecha: “
+ [Link]();
}
else
{
[Link] = false;
[Link] = “Sin viajes este día: “ +
[Link]();
}
}
286
6: Controles Web con [Link]
{
DateTime obj;
try
{
obj = [Link](s, DateTimeFormatInfo.
InvariantInfo);
}
catch (Exception exc)
{
[Link](“Error al mostrar la fecha” +
[Link] + “.”);
obj = [Link];
}
return obj;
}
287
[Link] con C#
}
}
public DateTime EventDate
{
get
{
return eventdate;
}
set
{
eventdate = value;
}
}
public string StartTime
{
get
{
return starttime;
}
set
{
starttime = value;
}
}
public string EndTime
{
get
{
return endtime;
}
set
{
endtime = value;
}
}
}
}
__________________________________________________________
288
6: Controles Web con [Link]
[Link]”>
<html xmlns=”[Link]
<head>
<title> Round the world </title>
</head>
<body>
<h4> Round the world trip </h4>
<form id = “ruta2” method = “post” runat = “server”>
<p align = “center”>
<asp:Calendar ID = “world” runat = “server”
SelectedDate = “01/01/2011”
VisibleDate = “01/01/2011”
FirstDayOfWeek = “Monday”
ShowDayHeader = “true”
DayHeaderStyle-BackColor = “#D8D8D8”
DayHeaderStyle-ForeColor = “Black”
DayHeaderStyle-BorderStyle = “Solid”
ShowGridLines = “true”
ShowNextPrevMonth = “true”
NextPrevStyle-BackColor = “#D8D8D8”
NextPrevStyle-ForeColor = “Black”
NextPrevStyle-Font-Bold = “true”
ShowTitle = “true”
TitleFormat = “MonthYear”
TitleStyle-BackColor = “#D8D8D8”
TitleStyle-ForeColor = “Black”
TitleStyle-BorderStyle = “Double”
TitleStyle-Font-Size = “Medium”
DayNameFormat = “FirstTwoLetters”
DayStyle-HorizontalAlign = “Right”
DayStyle-VerticalAlign = “Top”
SelectedDayStyle-BackColor = “#6E6E6E”
SelectedDayStyle-ForeColor = “Red”
SelectedDayStyle-Font-Bold = “true”
TodayDayStyle-BackColor = “#F3F781”
TodayDayStyle-VerticalAlign = “Top”
TodayDayStyle-HorizontalAlign = “Center”
OnDayRender = “rutaRender”
OnSelectionChanged = “rutaCambiar” />
</p>
<p align = “center”>
289
[Link] con C#
290
6: Controles Web con [Link]
</table>
</p>
</FooterTemplate>
</asp:Repeater>
</asp:Panel>
</form>
</body>
</html>
Estamos ante uno de los códigos más extensos del curso, aunque no debe
preocuparnos mucho. Vamos a explicar de forma sencilla qué es lo que hace este
código.
291
[Link] con C#
El resto del código ya nos es familiar y apenas hay cosas que reseñar, puesto que en
el HTML hemos incluido elementos de tipo tabla y les hemos dado un estilo propio y
apenas encontramos más elementos nuevos.
A la hora de programar, si estamos usando Visual Studio, nos podemos dar cuenta
de la cantidad de combinaciones posibles que nos ofrecen a la hora de elegir el estilo
de los objetos usados. Si pulsamos a la vez Shift + Espacio, se nos desplegará una
pestaña con todas las posibilidades que tenemos para una función o para un atributo.
El propio alumno puede crear su propio calendario e incluir los elementos que considere
necesarios.
292
6: Controles Web con [Link]
6.5. Code-Behind
Code-Behind es una técnica, quizá la más recomendable a la hora de programar con
[Link], en la que el programador tiene distintos ficheros. En un fichero tenemos
todos los métodos que se incluyen en los scripts y lo guardamos como un fichero C#,
es decir, con una extensión .cs. El resto de ficheros los podemos guardar como .aspx
y desde ellos hacer llamadas a los ficheros .cs. Veamos un ejemplo donde creemos un
fichero con los scripts y otro donde incluyamos el código HTML con [Link].
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
293
[Link] con C#
{
return aceptar;
}
set
{
aceptar = value;
}
}
Este fichero lo guardamos como [Link]. En Visual Studio al crear un fichero .cs
(tipo clase cuando le damos a agregar nuevo elemento) por defecto nos salen los
namespaces. Después simplemente tenemos que definir una clase que determine las
acciones que queremos realizar. Como siempre decimos, es importante recordar los
nombres que vamos a utilizar, ya que luego los vamos a necesitar.
Una vez ya hemos definido nuestro código .cs procedemos a crear un fichero .aspx:
<html>
<head runat = “server”>
<title> Página sin título </title>
</head>
<body>
Seleccione un color por favor
<form action = “[Link]” method = “post” runat =
“server” >
<asp:DropDownList ID = “lista” runat = “server” >
<asp:ListItem> Rojo </asp:ListItem>
<asp:ListItem> Amarillo </asp:ListItem>
<asp:ListItem> Verde </asp:ListItem>
<asp:ListItem> Azul </asp:ListItem>
</asp:DropDownList>
<br />
<asp:Button runat = “server” OnClick = “click” Text =
“Aceptar” />
<br />
294
6: Controles Web con [Link]
295
[Link] con C#
Para crear controles de elementos Web o Web parts tenemos tres bloques distintos
de creación como son la personalización, los componentes estructurales de la interfaz
de usuario y los controles de la interfaz de usuario de elementos web reales.
Como venimos avanzando, podemos trabajar de distintas formas con los Web parts:
crear páginas que utilicen Web parts, crear Web parts individuales o crear aplicaciones
completas para personalizarlas a nuestro gusto.
296
6: Controles Web con [Link]
Como siempre nos creamos un nuevo proyecto Web [Link] y esta vez vamos a
hacer algo nuevo. Al proyecto nuestro vamos a agregarle un nuevo elemento que será
una formulario Web nuevo, es decir, un archivo .aspx y nos vamos a la pestaña de
diseño y en el cuadro de herramientas cogemos un elemento WebPartManager de la
sección de elementos Web. Una vez arrastrado nos aparecerá lo siguiente:
Ahora podemos añadirle, por ejemplo, una tabla a través del menú Tabla > Insertar
Tabla y podemos poner, por ejemplo, una tabla con dos filas y dos columnas.
En cada una de las celdas creadas podemos poner un Web part distinto. Para ello
basta con arrastrar desde la barra de herramientas en la zona de elementos Web el
componente WebPartZone, quedando de la siguiente forma:
297
[Link] con C#
Si pinchamos sobre cualquiera de los Web parts, a la derecha nos aparecen todas las
propiedades que pueden adquirir cada uno de ellos. Esto mismo es lo que hacemos
dentro de las etiquetas. Por ejemplo, podemos darle un título al Web part a través de
la propiedad HeaderText que aparece a la derecha:
Si nos vamos a la parte del código, observaremos cómo se ha creado el código que
nosotros hemos ido “dibujando” a través de los controles:
</script>
<html>
<head runat = “server”>
<title> Ejemplo de un Web Part </title>
<style type = “text/css”>
.style1
{
width: 100%;
}
</style>
298
6: Controles Web con [Link]
</head>
<body>
<form id = “form1” runat = “server”>
<div>
</div>
</form>
</body>
</html>
299
[Link] con C#
Ahora lo que tendremos que hacer es incluir algo dentro de los Web parts. Por
ejemplo, vamos a incluir algo de texto, por lo que si nos vamos a la pestaña de diseño
podemos arrastrar una etiqueta Label hacia cualquiera de las zonas y dentro de ellas
escribir lo que nos parezca:
Además, podemos crearnos nuestros propios controles de usuario por lo que para
ello nos crearemos controles nuevos, es decir, tendremos que agregar un nuevo
elemento y seleccionar Control de Usuario Web y le damos cualquier nombre. Vamos
a crearnos, por ejemplo, una zona de conexión a la cuenta de correo imaginaria,
pudiéndolo hacer directamente desde la zona de diseño incluyendo dos cajas de texto
y un botón y darle el diseño deseado. Si por ejemplo, queremos que aparezca un salto
de línea entre el nombre de usuario y la contraseña, simplemente le damos a intro
donde queremos que aparezca, es decir, podemos usarlo como si de un procesador
de textos se tratara. El código quedaría así:
300
6: Controles Web con [Link]
Una vez creado este Web part podemos agregarlo a cualquiera de las zonas que
creamos antes específicas para los Web parts. Para poder realizar esto nos vamos a
nuestro archivo .aspx y desde el explorador de soluciones arrastramos el control de
usuario a cualquier zona, por ejemplo, la zona 2.
En cualquiera de las zonas podemos crearnos un Web part, por ejemplo, podemos
escribir lo siguiente:
301
[Link] con C#
<script runat=”server”>
</script>
<html>
<head runat = “server”>
<title> Ejemplo de un Web Part </title>
<style type = “text/css”>
.style1
{
width: 100%;
}
</style>
</head>
<body>
<form id = “form1” runat = “server”>
<div>
302
6: Controles Web con [Link]
<br />
<table class = “style1”>
<tr>
<td>
<asp:WebPartZone ID = “WebPartZone1”
runat = “server” HeaderText= “Zona 1”>
<ZoneTemplate>
<asp:Label ID=”Label1”
runat=”server” Title=”Titulo Parte 1”>
<h3> Esta es la zona del
primer Web Part </h3>
</asp:Label>
</ZoneTemplate>
</asp:WebPartZone>
</td>
<td>
<asp:WebPartZone ID = “WebPartZone2”
runat = “server” HeaderText = “Zona 2”>
<ZoneTemplate>
<uc1:Control1 ID=”Control11”
runat=”server” />
</ZoneTemplate>
</asp:WebPartZone>
</td>
</tr>
<tr>
<td>
<asp:WebPartZone ID = “WebPartZone3”
runat = “server” HeaderText = “Zona 3”>
<ZoneTemplate>
<asp:Label runat = “server” id
= “paginas” title = “Favoritos” BackColor = “Yellow”
ForeColor = “Blue”>
<a href = “[Link] >
Seas Estudios Abiertos </a>
<br />
<a href = “[Link]
Página de [Link] </a>
<br />
<a href = “[Link]
com”> Página de Microsoft </a>
<br />
303
[Link] con C#
</ZoneTemplate>
</asp:WebPartZone>
</td>
<td>
<asp:WebPartZone ID = “WebPartZone4”
runat = “server” HeaderText = “Zona 4”>
</asp:WebPartZone>
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
304
6: Controles Web con [Link]
<script runat=”server”>
public void Page_Load()
{
if (!([Link]))
{
ArrayList colores = new ArrayList();
[Link](“Red”);
[Link](“Yellow”);
[Link](“Green”);
[Link](“Blue”);
[Link](“Black”);
[Link] = colores;
[Link]();
}
}
</script>
<html>
<head runat = “server”>
<title> Ejemplo de un Web Part </title>
<style type = “text/css”>
.style1
{
width: 100%;
}
</style>
</head>
<body>
<form id = “form1” runat = “server”>
<div>
305
[Link] con C#
</asp:WebPartManager>
<br />
<br />
<table class = “style1”>
<tr>
<td>
<asp:WebPartZone ID = “WebPartZone1”
runat = “server” HeaderText= “Zona 1”>
<ZoneTemplate>
<asp:Label ID=”Label1”
runat=”server” Title=”Titulo Parte 1”>
<h3> Esta es la zona del
primer Web Part </h3>
</asp:Label>
</ZoneTemplate>
</asp:WebPartZone>
</td>
<td>
<asp:WebPartZone ID = “WebPartZone2”
runat = “server” HeaderText = “Zona 2”>
<ZoneTemplate>
<uc1:Control1 ID=”Control11”
runat=”server” />
</ZoneTemplate>
</asp:WebPartZone>
</td>
</tr>
<tr>
<td>
<asp:WebPartZone ID = “WebPartZone3”
runat = “server” HeaderText = “Zona 3”>
<ZoneTemplate>
<asp:Label runat = “server” id
= “paginas” title = “Favoritos” BackColor = “Yellow”
ForeColor = “Blue”>
<a href = “[Link] >
Seas Estudios Abiertos </a>
<br />
<a href = “[Link]
Página de [Link] </a>
<br />
<a href = “[Link]
306
6: Controles Web con [Link]
</ZoneTemplate>
</asp:WebPartZone>
</td>
<td>
<asp:WebPartZone ID = “WebPartZone4”
runat = “server” HeaderText = “Zona 4”>
<ZoneTemplate>
<uc2:control2 ID = “usuario”
runat = “server” />
<asp:DropDownList ID = “lista”
runat = “server”>
</asp:DropDownList>
<asp:Button ID = “Button1”
Text = “Cambie la cabecera” OnClick = “click” runat =
“server” />
<asp:Label ID = “color” runat
= “server”> </asp:Label>
</ZoneTemplate>
</asp:WebPartZone>
</td>
</tr>
</table>
</div>
</form>
</body>
</html>
307
[Link] con C#
Nos vamos a la vista diseño y desde ahí podremos verlo bastante más claro. Primero
elegimos la zona donde incluir los elementos que van a poder ser modificados por
el usuario, hasta ahí arrastramos el elemento CatalogZone de la parte de elementos
Web de la barra de herramientas, y dentro del CatalogZone incluimos un elemento
DeclarativeCatalogPart. En el menú de tareas de las mismas seleccionaremos editar
plantillas, por lo que nos saldrá una plantilla (“Template”) en la cual incluiremos de la
sección estándar del cuadro de herramientas los elementos UploadFile y Calendar.
308
6: Controles Web con [Link]
<br />
<br />
<table class = “style1”>
<tr>
<td>
<asp:WebPartZone ID = “WebPartZone1”
runat = “server” HeaderText= “Zona 1”>
<ZoneTemplate>
<asp:Label ID=”Label1”
runat=”server” Title=”Titulo Parte 1”>
<h3> Esta es la zona del
primer Web Part </h3>
</asp:Label>
</ZoneTemplate>
</asp:WebPartZone>
<asp:CatalogZone ID=”CatalogZone1”
runat=”server” HeaderText=”Elementos Web”>
<ZoneTemplate>
<asp:DeclarativeCatalogPart
ID=”DeclarativeCatalogPart1” runat=”server”>
<WebPartsTemplate>
<asp:FileUpload
ID=”FileUpload1” runat=”server” />
<asp:Calendar
ID=”Calendar1” runat=”server”></asp:Calendar>
</WebPartsTemplate>
</asp:DeclarativeCatalogPart>
</ZoneTemplate>
</asp:CatalogZone>
</td>
<td>
<asp:WebPartZone ID = “WebPartZone2”
runat = “server” HeaderText = “Zona 2”>
<ZoneTemplate>
<uc1:Control1 ID=”Control11”
runat=”server” />
</ZoneTemplate>
</asp:WebPartZone>
</td>
</tr>
<tr>
<td>
309
[Link] con C#
<asp:WebPartZone ID = “WebPartZone3”
runat = “server” HeaderText = “Zona 3”>
<ZoneTemplate>
<asp:Label runat = “server” id
= “paginas” title = “Favoritos” BackColor = “Yellow”
ForeColor = “Blue”>
<a href = “[Link] >
Seas Estudios Abiertos </a>
<br />
<a href = “[Link]
Página de [Link] </a>
<br />
<a href = “[Link]
com”> Página de Microsoft </a>
<br />
<a href = “[Link]
Página de Google </a>
<br />
</asp:Label>
</ZoneTemplate>
</asp:WebPartZone>
</td>
<td>
<asp:WebPartZone ID = “WebPartZone4”
runat = “server” HeaderText = “Zona 4”>
<ZoneTemplate>
<uc2:control2 ID = “usuario”
runat = “server” />
<asp:DropDownList ID = “lista”
runat = “server”>
</asp:DropDownList>
<asp:Button ID = “Button1”
Text = “Cambie la cabecera” OnClick = “click” runat =
“server” />
<asp:Label ID = “color” runat
= “server”> </asp:Label>
</ZoneTemplate>
</asp:WebPartZone>
</td>
</tr>
</table>
310
6: Controles Web con [Link]
RESUMEN
■
Aparte de los controles de servidor de [Link] tenemos los controles de usuario y
los controles HTML. Los controles HTML son los propios del lenguaje HTML y que son
entendidos por el servidor y los de usuario son los diseñados y desarrollados por el
usuario.
■
Algunas de las características más importantes sobre los controles de servidor ASP.
NET es que es capaz de detectar automáticamente sobre qué navegador estamos
actuando, eliminar esa detección de navegador para poder usar nuestro código en
cualquier creación de objetos y eventos, y las propiedades que nos permitan dar un
diseño más llamativo.
■
El ciclo de vida de una página [Link] no es más que el proceso que realiza una
página desde que la llamamos hasta que la cerramos. El proceso consta de tres pasos:
Page_Load, Manejo de eventos y Page_Unload.
■
Existen varios tipos de controles de servidor [Link], controles intrínsecos, controles
Rich, controles de validación y controles de interpretación.
■
Code-Behind es una técnica de programación en la que separamos lo que es código
HTML de lo que es código C#. Para ello deberemos crear distintos ficheros.
■
Los Web parts son controles integrados que permiten al usuario modificar, manipular y
administrar la apariencia y contenido de las páginas Web a su gusto.
■
Los Web parts se pueden incluir en páginas Web, los podemos crear nosotros
individualmente e incluso podemos crear páginas únicamente con Web parts.
311
7
[Link] con C#
7
DIDÁCTICA
UNIDAD
7. Manejo de errores
7: Manejo de errores
ÍNDICE
ÍNDICE.......................................................................................................................................................................... 315
OBJETIVOS................................................................................................................................................................ 317
INTRODUCCIÓN....................................................................................................................................................... 318
7.1. ¿Qué hacer para evitar errores?........................................................................................................................ 319
7.2. Tipos de errores................................................................................................................................................... 320
7.2.1. Errores de sintaxis............................................................................................................................................... 320
7.2.2. Errores lógicos.................................................................................................................................................... 321
7.2.3. Errores de sistema............................................................................................................................................... 326
7.3. Pruebas para detectar errores............................................................................................................................ 327
7.4. Localizar errores.................................................................................................................................................. 334
7.4.1. Errores de configuración...................................................................................................................................... 334
7.4.2. Errores de párser................................................................................................................................................ 334
7.4.3. Errores de compilación........................................................................................................................................ 334
7.4.4. Errores en tiempo de ejecución............................................................................................................................. 338
7.4.5. Modo debug...................................................................................................................................................... 344
7.4.6. Modo traza......................................................................................................................................................... 344
7.5. Control de errores manualmente....................................................................................................................... 349
7.5.1. Excepciones...................................................................................................................................................... 349
7.5.2. Page_error ()...................................................................................................................................................... 358
RESUMEN................................................................................................................................................................... 363
315
7: Manejo de errores
OBJETIVOS
■ Conocer los distintos tipos de errores que puedan afectar a nuestra página.
■ Conocer técnicas que sean capaces de prevenir los errores, más vale prevenir que curar.
317
[Link] con C#
INTRODUCCIÓN
Cuando estamos programando es más que evidente Hay muchos tipos de errores, a veces estará en nuestras
que mientras estamos escribiendo el código nos manos el atraparlos y otras veces se nos escaparán o
equivoquemos. Es casi imposible escribir un código bien por despiste, o bien porque no podemos hacer
medianamente complejo sin tener errores, ya sean de nada al respecto como la caída de un servidor. Pues
compilación o de ejecución. Nos podemos equivocar bien, nuestro objetivo como programador es hacer
a la hora de escribir un nombre, de llamar a un método tantas pruebas como sea necesario para atrapar
equivocado o simplemente que estemos intentando errores y poder tener una página robusta, que haga lo
hacer algo prohibido por nuestro lenguaje o tecnologí[Link] tiene que hacer y que no provoque el cabreo de
Es por todo esto que es más que importante saber los usuarios.
buscar errores, encontrarlos y por encima de todas Hay muchas formas de atrapar errores de manera
las cosas, solucionarlos. Normalmente cuando sencilla y que no nos va a llevar mucho tiempo
tenemos un error es el propio compilador el que nos codificar dichas formas de caza de errores. Nosotros
avisa dónde puede existir un error. Es verdad que no mismos vamos a ser capaces de atrapar errores que
siempre el error está en la línea indicada, sino en la no queremos que aparezcan en nuestra página o de
referencia que se hace de esta línea. usos indebidos en ella.
Para encontrar errores existen muchas técnicas, como
debuggear por la zona donde creemos que está el
error, o incluyendo trozos de código para ver dónde se
encuentra el error que estamos buscando.
318
7: Manejo de errores
Hoy en día gracias a los editores y compiladores que existen es mucho más asequible
encontrar un error que hace unos años. A modo de curiosidad, se piensa que el primer
caso de búsqueda y solución de un error se produjo en 1947 cuando un insecto se
coló dentro de uno de los relés de la máquina, provocando su fallo. De aquí viene la
palabra debug (bug significa insecto en inglés) que significa en la actualidad depurar.
Para empezar a tratar errores, incluso si no los tenemos, es importante que entendamos
a la perfección nuestro código para poder averiguar dónde estamos fallando y en qué
zona del código está cada cosa. Una vez hayamos localizado dónde puede estar
nuestro posible error, lo mejor es asegurarse que las condiciones bajo las que nuestro
error puede ocurrir son estables. Por este motivo siempre es un acierto comentar
el código. Cuando un programador trabaja en un equipo, el código que uno realice
pasará por varias manos y es importante que éstos sepan qué es lo que hace el
código. Por lo tanto, ante líneas de código que puedan causar dudas lo mejor es
comentarlas.
Gracias a sentencias como el if, else if o else vamos a ser capaces de buscar errores
y encontrar el posible fallo de nuestro código. Cuando estemos programando también
es importante saber los nombres que estamos asignando a las variables o a los
métodos y tenemos que intentar dar nombres que se asemejen a lo que estamos
haciendo. El hecho de usar mayúsculas y minúsculas también nos puede ayudar. Si
realmente no sabemos qué nombre darle a un método, lo mejor es hacer un breve
comentario explicando lo que hace dicho método.
Como se puede pensar, existen distintos tipos de errores, entre los que se encuentran
los errores de sintaxis, errores lógicos o errores de sistema. En el siguiente apartado
haremos un repaso sobre todos ellos y explicaremos en qué consisten cada uno de
ellos.
319
[Link] con C#
<html>
<head>
<title> Error de sintaxis </title>
</head>
<body>
<form method = “post” action = “[Link]”
runat = “server”>
<asp:Labl id = “error” runat = “server”> </
asp:Labl>
</form>
</body>
</html>
Al escribir este código de manera errónea, véase que la etiqueta la hemos escrito de
forma errónea intencionadamente, en el navegador obtendremos un error del siguiente
tipo:
320
7: Manejo de errores
En concreto se nos avisa de que hay una “Etiqueta de servidor ‘asp:Labl’ desconocida”.
<html>
<head>
<title> Error de sintaxis </title>
</head>
<body>
<form method = “post” action = “[Link]”
runat = “server”>
<asp:Label id = “error” runat = “server” Text
= “Error corregido” > </asp:Label>
</form>
</body>
</html>
■■ División por 0.
■■ Incompatibilidad de tipos.
■■ Error en la devolución.
■■ Datos inválidos.
321
[Link] con C#
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
<html xmlns=”[Link]
<head>
322
7: Manejo de errores
323
[Link] con C#
Un resultado que intenta dividir por 0, lo que provoca que el navegador lance un
mensaje de error. Para solucionarlo podemos hacer lo siguiente:
324
7: Manejo de errores
[Link] = [Link]();
}
catch
{
[Link] = “Se ha producido un error”;
}
}
325
[Link] con C#
326
7: Manejo de errores
Hagamos un ejemplo en el que intentemos atrapar todos los posibles errores que nos
puedan ir surgiendo cuando tenemos que introducir un entero:
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
327
[Link] con C#
{
if (!([Link]([Link], 0)))
{
if ([Link](0, 1) != “-”)
{
[Link] = “Este campo es numérico,
así que por favor, no molestes más al código. “;
}
else
{
[Link] = “A ver, no puedes comprar
menos de 0 productos. “;
}
}
else if (Convert.ToInt32([Link]) == 0)
{
[Link] = “Ya que has entrado cómprame
algo no. Me siento ofendido si no compras nada. “;
}
else if (Convert.ToInt32([Link]) > 0)
{
[Link] = “Gracias por comprarme algo.
“;
}
}
else
{
[Link] = “Por favor, introduzca una
cantidad válida. “;
}
}
}
__________________________________________________________
<html xmlns=”[Link]
<head>
328
7: Manejo de errores
329
[Link] con C#
Como se puede observar, hemos comprobado que el campo no esté vacío, que sea
mayor o igual que 0 y que sea un valor numérico. Al haber hecho un Convert.ToInt32, si
metemos un valor decimal nos sale un error diciéndonos que es un campo numérico.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
if ([Link] != “”)
{
if (!([Link]([Link], 0)))
{
if ([Link](0, 1) != “-”)
330
7: Manejo de errores
{
[Link] = “Este campo es numérico,
así que por favor, no molestes más al código. “;
}
else
{
[Link] = “A ver, no puedes comprar
menos de 0 productos. “;
}
}
else if (Convert.ToInt32([Link]) == 0)
{
[Link] = “Ya que has entrado cómprame
algo no. Me siento ofendido si no compras nada. “;
}
else if (Convert.ToInt32([Link]) > 0)
{
[Link] = “Gracias por comprarme algo.
“;
}
}
else
{
[Link] = “Por favor, introduzca una
cantidad válida. “;
}
if ([Link](“”))
{
[Link] = “Introduzca un nombre de usuario.
“;
}
}
}
<html xmlns=”[Link]
<head>
<title> Control de errores </title>
331
[Link] con C#
</head>
<body>
<form id=”Form1” method = “post” action = “Default.
aspx” runat = “server”>
Introduzca el número de productos que se va a llevar.
Cuantos más, mejor.
<br />
Cantidad:
<asp:TextBox ID=”texto” runat=”server”> </asp:TextBox>
<br />
<asp:RequiredFieldValidator
ID=”RequiredFieldValidator1” ControlToValidate = “usuario”
runat = “server”
ErrorMessage = “Debe rellenar el campo usuario”>
</asp:RequiredFieldValidator>
<br />
Usuario:
<asp:TextBox ID=”usuario” runat=”server”> </
asp:TextBox>
<br />
<asp:Button ID=”boton” runat=”server” Text=”Aceptar”
OnClick=”Page_Load” />
<br />
<b>
<asp:Label ID=”fallo” runat=”server”> </
asp:Label></b>
</form>
</body>
</html>
Como se puede observar en el ejemplo, hemos incluido un campo que debe ser
obligatorio. Para ello hemos usado el control RequiredFieldValidator que vimos en la
unidad anterior. Como resultado debemos obtener lo siguiente:
332
7: Manejo de errores
333
[Link] con C#
En [Link] pueden ocurrir varios tipos de errores, como por ejemplo, errores de
configuración, errores en el párser, errores de compilación o errores en tiempo de
ejecución. A continuación vamos a detallar cada uno de estos tipos de errores:
■■ Errores de configuración.
■■ Errores de párser.
■■ Errores de compilación.
Como recordarás, C# tiene una serie de palabras reservadas, que puede ser que
no coincidan con las de otro lenguaje. Como [Link] puede trabajar con varios
lenguajes, es posible que con el lenguaje que estemos usando tengamos un error,
pero con otro lenguaje y el mismo código no. Por lo que podemos decir que son
errores que afectan a nuestro código en [Link], pero que no son provocados por
éste. Por ejemplo, si usamos el código de apartados anteriores haciendo una pequeña
modificación en el segundo if:
334
7: Manejo de errores
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
335
[Link] con C#
menos de 0 productos. “;
}
}
else if (Convert.ToInt32([Link]) == 0)
{
[Link] = “Ya que has entrado cómprame
algo no. Me siento ofendido si no compras nada. “;
}
else if (Convert.ToInt32([Link]) > 0)
{
[Link] = “Gracias por comprarme algo.
“;
}
}
else
{
[Link] = “Por favor, introduzca una
cantidad válida. “;
}
if ([Link](“”))
{
[Link] = “Introduzca un nombre de usuario.
“;
}
}
}
<html xmlns=”[Link]
<head>
<title> Control de errores </title>
</head>
<body>
<form id=”Form1” method = “post” action = “Default.
aspx” runat = “server”>
Introduzca el número de productos que se va a llevar.
Cuantos más, mejor.
<br />
336
7: Manejo de errores
Cantidad:
<asp:TextBox ID=”texto” runat=”server”> </asp:TextBox>
<br />
<asp:RequiredFieldValidator
ID=”RequiredFieldValidator1” ControlToValidate = “usuario”
runat = “server”
ErrorMessage = “Debe rellenar el campo usuario”>
</asp:RequiredFieldValidator>
<br />
Usuario:
<asp:TextBox ID=”usuario” runat=”server”> </
asp:TextBox>
<br />
<asp:Button ID=”boton” runat=”server” Text=”Aceptar”
OnClick=”Page_Load” />
<br />
<b>
<asp:Label ID=”fallo” runat=”server”> </
asp:Label></b>
</form>
</body>
</html>
337
[Link] con C#
if ([Link] != “”)
{
if ([Link](“”))
{
if ([Link](0, 1) != “-”)
{
[Link] = “Este campo es numérico,
así que por favor, no molestes más al código. “;
}
else
{
[Link] = “A ver, no puedes comprar
menos de 0 productos. “;
}
}
else if (Convert.ToInt32([Link]) == 0)
{
[Link] = “Ya que has entrado cómprame
algo no. Me siento ofendido si no compras nada. “;
}
else if (Convert.ToInt32([Link]) > 0)
{
[Link] = “Gracias por comprarme algo.
“;
}
}
else
{
[Link] = “Por favor, introduzca una
cantidad válida. “;
}
if ([Link](“”))
{
[Link] = “Introduzca un nombre de usuario.
“;
}
}
338
7: Manejo de errores
Como su propio nombre indica son errores que se producen durante la ejecución y no
durante la compilación o haciendo el párser. Son errores que se producen cuando el
usuario introduce elementos no válidos en algunos campos.
Supongamos que un usuario intenta darse de alta en una nueva cuenta de correo;
si el usuario se registrase con el nombre usuario@[Link], no tendría ningún
tipo de error, pero si en cambio intenta registrarse con el nombre de usuario@correo,
el compilador detectará un error en tiempo de ejecución. Este tipo de errores ya lo
hemos visto en apartados anteriores.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
339
[Link] con C#
“;
}
}
else
{
[Link] = “Por favor, introduzca una
cantidad válida. “;
}
if ([Link](“”))
{
[Link] = “Introduzca un nombre de usuario.
“;
}
}
}
<html>
<head>
<title> Control de errores </title>
</head>
<body>
<form id=”Form1” method = “post” action = “Default.
aspx” runat = “server”>
Introduzca el número de productos que se va a llevar.
Cuantos más, mejor.
<br />
Cantidad:
<asp:TextBox ID=”texto” runat=”server”> </asp:TextBox>
<br />
<asp:RequiredFieldValidator ControlToValidate =
“usuario” runat = “server”
ErrorMessage = “Debe rellenar el campo usuario”>
</asp:RequiredFieldValidator>
<br />
Usuario:
<asp:TextBox ID=”usuario” runat=”server”> </
asp:TextBox>
<br />
<asp:Button ID=”boton” runat=”server” Text=”Aceptar”
OnClick=”pruebas” />
<br />
<b>
<asp:Label ID=”fallo” runat=”server”> </
340
7: Manejo de errores
asp:Label></b>
</form>
</body>
</html>
Aparte de los errores aquí comentados, pueden existir muchos tipos de errores como
no encontrar el recurso externo que estamos usando, por ejemplo, que una base de
datos a la que estamos accediendo no esté disponible o que se encuentre en otra
ruta. Nosotros mismos podemos lanzar el error configurando el fichero [Link].
Hemos nombrado algunas veces ya el fichero [Link]. Pues bien, cuando nos
creamos una nueva página Web en Visual Studio estamos generando una serie de
ficheros que hasta ahora no hemos tocado. Si nos vamos a la parte izquierda del
editor en la pestaña de explorador de soluciones, tenemos un fichero denominado
[Link]:
Sobre este fichero podemos hacer ciertas modificaciones que permitirán atrapar
errores. Si abrimos dicho fichero, nos encontraremos con un código de configuración
y justo hay una parte que está comentada que es la que nos interesa a nosotros.
Vamos a habilitarla y obtendremos ya un código de este tipo:
341
[Link] con C#
<html>
<head>
<title> Errores </title>
</head>
<body>
<h2> MANTENIMIENTO </h2>
<br />
<h4> Estamos trabajando para mejorar la página para usted
<br />
Disculpen las molestias, pronto estaremos a su servicio.
</h4>
</body>
</html>
342
7: Manejo de errores
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
343
[Link] con C#
344
7: Manejo de errores
<head>
<title> Lista Desplegable </title>
</head>
<body>
<br />
<form id=”Form1” runat=”server”>
Elija una opcion
<br />
<br />
<asp:DropDownList forecolor=”red” ID=”list1”
runat=”server”>
<asp:ListItem>1</asp:ListItem>
<asp:ListItem>2</asp:ListItem>
<asp:ListItem>3</asp:ListItem>
<asp:ListItem>4</asp:ListItem>
</asp:DropDownList>
<br />
<br />
<input type=”submit” />
</form>
</body>
</html>
345
[Link] con C#
Luego observamos otra sección denominada árbol de control que nos informa de los
distintos controles usados.
Después aparece una serie de secciones que no nos importan demasiado, excepto la
última donde se muestran los distintos encabezados enviados por el cliente al servidor:
346
7: Manejo de errores
Solo reseñar que en la última sección podemos visualizar todos los elementos de las
variables del servidor.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
347
[Link] con C#
{
[Link](“Error error error”, “El contador
no sube”);
}
}
}
348
7: Manejo de errores
7.5.1. Excepciones
Como hemos visto, una excepción es un error controlado y lo podemos usar gracias a
la importación de la clase [Link]. Para capturar las excepciones se puede
operar de muchas formas desde usando un bloque try-catch-finally, hasta un catch
múltiple.
[Link]. Try-catch-finally
Ya hemos visto algunos ejemplos donde aparecen este tipo de bloques, pero que por
lo general tendrán la siguiente estructura:
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
349
[Link] con C#
{
//En esta zona es donde se tratan los posibles
errores producidos
//en la zona del try.
}
finally
{
//En esta zona de código se debe ejecutar el
código pase lo que pase
//en las zonas de arriba.
}
}
}
Es conveniente saber que un uso abusivo de los try-catch puede producir un consumo
elevado de los recursos. Vamos a estudiar el siguiente ejemplo:
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
350
7: Manejo de errores
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
351
[Link] con C#
{
try
{
//En esta zona de código va la parte que
queremos que ocurra.
//Es el sitio donde puede ser que se produzcan
los fallos
}
catch (SystemException exc)
{
//En esta zona es donde se tratan los posibles
errores producidos
//en la zona del try. Si es capaz de tratar la
excepción se hace aquí.
//Si no es capaz de tratarla pasa al siguiente
bloque.
}
catch (Exception exc)
{
//En esta zona es donde se tratan los posibles
errores producidos
//en la zona del try. Solo se ejecuta esta
zona de código si no se ha podido
//tratar la excepción en los bucles anteriores
y si esta excepción puede
//ser tratada aquí
}
//Aquí solo se llega si la excepción no ha
podido ser tratada por ninguno
//de los bloques catch anteriores. En el caso
de que se llegue aquí entonces
//tenemos que abortar el código, con el
consiguiente error
}
}
}
[Link]. Throw
Las excepciones cazadas anteriormente son lanzadas por .NET, pero tenemos la
opción de crear nosotros mismos nuestras propias excepciones. Esto lo podemos
hacer manualmente, si por ejemplo, no se cumple alguna de las condiciones que
propongamos al usuario. Un caso sería si hemos creado una página para que los
usuarios se den de alta y les proponemos un formulario que tienen que rellenar para tal
propósito. Aquí, podemos crearnos una serie de excepciones inventadas por nosotros
352
7: Manejo de errores
que, por ejemplo, lance un error si ya hay un usuario con ese nombre, o si por ejemplo,
introducen una contraseña de menos de 6 caracteres. La estructura de un catch sería
la siguiente:
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
Como se puede observar, para que se lance una excepción se tiene que cumplir una
condición que en el caso de que se cumpla se entra en el bucle y se trata la excepción
que hemos creado. Para crear una excepción se hace de esa manera:
Existen muchas excepciones predefinidas propias del lenguaje que estemos usando.
Por ejemplo, como todos sabemos, si intentamos dividir en una calculadora un
número entre 0, en la calculadora podemos ver math error o algo parecido. Pues bien,
esto podría ser un tipo de excepción propio del lenguaje en el que está programada
la calculadora. Esto mismo puede ocurrir cuando estamos usando C#, que tiene
excepciones que son lanzadas automáticamente con su error. Entre estas excepciones
las más comunes son:
353
[Link] con C#
Existen muchas más excepciones, siendo las más comunes las vistas arriba. Veamos
un ejemplo de cómo usar las excepciones:
Un ejemplo más donde se pueda ver cómo actuaría el compilador en el caso de que
no se cumpla alguna de las restricciones propuestas:
354
7: Manejo de errores
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
355
[Link] con C#
Como podemos observar, en este caso hemos lanzado una excepción fuera de rango
en el caso de que se supere el límite del array. Durante el proceso se va incrementando
la i y como hemos puesto i <= 10 en el momento que se llega al 10, entonces se llega
a la excepción en la que se ha accedido a un elemento fuera de rango.
Proceso finalizado.
356
7: Manejo de errores
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
357
[Link] con C#
Éste es un ejemplo sencillo, pero en realidad podemos anidar muchos más bloques
unos dentro de otros. Supongamos que en vez de anidar bucles if lo hacemos con
bucles try. El funcionamiento es muy similar.
7.5.2. Page_error ()
Este tipo de errores son capturados en el caso de que se nos haya escapado alguna
condición, o que no nos hayamos acordado de controlar algún error. El método Page_
Error es un tipo de error perteneciente a la clase Page y que sirve para manejar errores
a nivel de la página.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
void excepciones ()
{
358
7: Manejo de errores
Como podemos ver, hemos usado un ejemplo anterior cambiando un par de bloques.
Hemos incluido el método Page_Error() y hemos eliminado los bucles, donde
atrapábamos la excepción en la que se accedía a un índice fuera de rango.
En esta ocasión es el método Page_Error el que trata la excepción y con ella enviamos
un mensaje que se lanza a través del control GetLastError, que nos muestra el error
atrapado con un mensaje enviado por el propio [Link]. Después debemos liberar el
servidor a través del control ClearError. Éste debe ser el resultado del código anterior:
Error:
359
[Link] con C#
[Link](EventArgs e) en [Link]() en
[Link](Boolean includeStagesBeforeAsyncPoint,
Boolean includeStagesAfterAsyncPoint)
Para finalizar con la unidad, vamos a llegar al peor de los casos. Supongamos que
hemos hecho todas las pruebas posibles y decidimos subir la página. Pues bien, una
vez subida la página existe la posibilidad de que aparezca algún error más, y para ello
[Link] nos permite avisar al administrador del sitio de que ha ocurrido un error.
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
void excepciones ()
{
360
7: Manejo de errores
}
void Page_Error(object o, EventArgs args)
{
[Link] (“<b>” + “Vaya vaya vaya, un error
por aquí “ + [Link]().ToString());
[Link]();
Debemos incluir las líneas de código dentro del Page_Error y en ellas debemos
especificar quién manda, quién recibe y el motivo. Hay otras muchas opciones que
podemos incluir en el email que se envíe, como el cuerpo del mensaje o la url de
donde procede, siendo estos campos opcionales.
No podemos mostrar una imagen de este error porque no tenemos una dirección
exacta desde la que enviar ni a la que enviar.
361
7: Manejo de errores
RESUMEN
■ En esta unidad hemos aprendido a usar técnicas que puedan evitar errores.
■
Existen muchos tipos de errores, errores de sintaxis, errores de sistema y errores
lógicos, siendo estos últimos los más comunes, como por ejemplo la división por 0, el
uso de datos inválidos o el acceso a objetos inexistentes.
■
Hemos aprendido a realizar pruebas para detectar los errores. Este paso es complejo,
pero necesario antes de subir una página. Hay que hacer las pruebas necesarias para
asegurarnos de que no se van a producir errores.
■
Existen otros tipos de errores que se puedan producir como son los errores de
configuración, los errores de párser, los errores de compilación o los errores en tiempo
de ejecución.
■
Para saber dónde se han producido los errores podemos usar varias técnicas, como
usar el modo debug o el modo traza para encontrarlos.
■
También podemos controlar los errores manualmente, normalmente a través de
excepciones. Para ello hay varias técnicas como usar bloques try-catch o catch
múltiples.
■
Existen errores mucho más complejos que se nos pueden escapar de las manos y
para ello podemos usar el método Page_Error, o el envío de un email al administrador
de la página para detectarlos.
363
8
[Link] con C#
8
DIDÁCTICA
UNIDAD
ÍNDICE
ÍNDICE.......................................................................................................................................................................... 367
OBJETIVOS................................................................................................................................................................ 369
INTRODUCCIÓN....................................................................................................................................................... 370
8.1. Principios de seguridad...................................................................................................................................... 371
8.1.1. Servicios de usuarios........................................................................................................................................... 371
8.1.2. Servicios empresariales........................................................................................................................................ 376
8.1.3. Servicios de datos............................................................................................................................................... 376
8.2. Seguridad............................................................................................................................................................. 377
8.3. Proveedor Membership....................................................................................................................................... 399
8.3.1. Método Initialize.................................................................................................................................................. 399
8.3.2. Propiedad EnablePasswordReset........................................................................................................................... 399
8.3.3. Propiedad EnablePasswordRetrieval....................................................................................................................... 400
8.3.4. Propiedad Requiresquestionandanswer................................................................................................................... 400
8.3.5. Propiedad RequiresUniqueMail.............................................................................................................................. 400
8.3.6. Propiedad PasswordFormat.................................................................................................................................. 400
8.3.7. Propiedad MaxInvalidPasswordAttempts.................................................................................................................. 401
8.3.8. Método CreateUser............................................................................................................................................. 406
8.3.9. Métodos UpdateUser, DeleteUser, GetUser y ValidateUser.......................................................................................... 406
8.3.10. Método GetAllUsers........................................................................................................................................... 406
8.3.11. Método GetNumberOfUsersOnline....................................................................................................................... 406
8.3.12. Método ResetPassword y GetPassword................................................................................................................ 406
8.3.13. Método ChangePassword................................................................................................................................... 407
8.3.14. Método ChangePasswordQuestionAndAnswer....................................................................................................... 407
RESUMEN................................................................................................................................................................... 409
367
8: Protección y seguridad para [Link]. Personalización
OBJETIVOS
■ Conocer algunos principios sobre la seguridad en las páginas Web.
■
Conocer el proveedor Membership de Microsoft para el almacenamiento y manipulación
de los datos de usuario.
369
[Link] con C#
INTRODUCCIÓN
La seguridad en Internet es uno de los mayores Por otro lado, echaremos un vistazo a los Web parts,
problemas que se puede encontrar tanto a nivel de que son elementos que permiten la personalización
usuario como a nivel de administrador. Tener una de las páginas Web a través de controles Web de
página segura es un hecho prioritario, puesto que usuarios.
de lo contrario nuestra página sería muy vulnerable a Gracias a este tipo de controles el administrador o
ataques. desarrollador de una página le ofrece al usuario la
Desde el punto de vista del administrador de la posibilidad de visualizar la página de una manera u
página lo importante es evitar tanto ataques a la otra, o permitir modificar el contenido de la misma
página como ataques al usuario, por lo que para ello según sus prioridades y preferencias.
no debe escatimar en esfuerzos para conseguir una
página segura. Desde el punto de vista del usuario
lo importante es que éste no sea atacado y que su
navegación por la Web sea segura y, que los datos que
vaya incluyendo en la Web no puedan ser transmitidos
ni sean visibles a los hackers.
Para ello crearemos el típico caso de introducir un
nombre de usuario y contraseña para poder acceder
a una página en concreto. Éste es un ejemplo que
parece sencillo, pero pongámonos en situación. El
administrador debe tener en cuenta que para acceder
a ciertos contenidos de la página los usuarios necesitan
registrarse. Para hacerlo, el desarrollador debe ir
incluyendo todos los registros de usuario en una base
de datos a través de la cual se deben comprobar los
datos cada vez que uno de ellos se conecte.
370
8: Protección y seguridad para [Link]. Personalización
En el caso que nos interesa, que no es otro que en [Link], éste puede tomar como
modo de autenticación entre varias opciones, como son Windows, Forms o Passport.
Como ya sabemos de la primera unidad con el modo Windows, el encargado de
identificar al usuario es el Internet Information Service, es decir, IIS. Si nos atenemos al
modo Forms, lo más usual es tener una página de conexión para reconocer al usuario,
cuya identidad se comprueba a través de una base de datos, en la que se compara
el nombre de usuario y la contraseña introducidos con los que existe en la base de
datos. El modo passport no difiere apenas en nada en del tipo forms, excepto que nos
proporciona una autenticación centralizada con los servicios de Microsoft.
<!--
La sección <authentication> habilita la
configuración
del modo de autenticación de seguridad
utilizado por
371
[Link] con C#
Los modos en los que puede actuar una Web se pueden configurar en el [Link],
donde tenemos la opción de manipular las autorizaciones, permitiendo o no el acceso
a ciertos contenidos para los usuarios. La forma de modificar estos permisos se puede
definir de la siguiente forma:
<authorization>
<deny users = “?” />
<!--Con deny users = “?” estamos diciendo que es una
zona
prohibida para los usuarios desconocidos -->
</authorization>
Vamos a ver un ejemplo de cómo podemos conectarnos a una página Web que
requiera un nombre de usuario y una contraseña. Para ello vamos a necesitar crearnos
una nueva página dentro de alguno de los proyectos que hayamos realizado, por
ejemplo, vamos a usar el del calendario del plan de vuelos.
Así que como hemos dicho, nos creamos una nueva página (botón derecho sobre el
proyecto, agregar nuevo elemento, formulario web) y la denominamos autenticacion.
aspx, por ejemplo, y dentro de ella vamos a incluir el siguiente código:
using System;
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
using [Link];
372
8: Protección y seguridad para [Link]. Personalización
<html xmlns=”[Link]
<head>
<title> Control de errores </title>
373
[Link] con C#
</head>
<body>
<form id = “form1” runat = “server”>
<LoginButtonStyle
BackColor = “#FFFBFF”
BorderColor = “#CCCCCC”
BorderStyle = “Solid”
ForeColor = “#284775” />
</asp:Login>
</form>
</body>
</html>
Como podemos ver, nos hemos creado dos métodos para poder autenticar a los
usuarios. El primer método lo que hace es que una vez introducidos el nombre de
usuario y contraseña, siendo éstos correctos, nos redirecciona a la página que
queremos y el segundo método lo que hace es comprobar que el nombre de usuario
y contraseña introducidos son correctos. Para ello toma tres parámetros, 2 de ellos
los que ha introducido el usuario (usuario y contraseña) y un tercer parámetro que
sirve para recordarlos. En nuestro caso hemos usado como usuario = usuario y
como contraseña = [Link]. En un caso real esto serviría quizá en el caso de que el
administrador tenga puesto un nombre de usuario y contraseña únicos para poder
entrar él mismo. Normalmente lo que ocurre es que cada vez que un usuario se da
de alta, sus datos de usuario y contraseña son almacenados en una base de datos
y la página tendrá que leer de esa base de datos el nombre de usuario y contraseña.
En la parte del HTML hemos usado una nueva pestaña que es la pestaña Login que
nos permite crearnos un formulario para comprobar el usuario y la contraseña. Esta
etiqueta por defecto nos muestra el botón de conexión que al pulsarlo implementa
onauthenticate, que es muy parecido al onClick y también muestra la pestaña de
recordar la próxima vez que visite la página.
374
8: Protección y seguridad para [Link]. Personalización
Esto aún no funciona, pues todavía nos queda comunicar a qué página tiene que
redirigirse una vez hayamos introducido nuestros nombres de usuario y contraseña.
Para ello tenemos que abrir el [Link] y en él introducir el siguiente bloque:
</forms>
</authentication>
<authorization>
<deny users = “?”/>
</authorization>
Como podemos observar, antes que nada hemos definido el modo de autenticación a
Forms. Tenemos que crear después un bloque con etiquetas forms y dentro de éste
especificar la ruta a la que se dirige una vez comprobado los datos en defaultUrl y
desde donde se autentica, que es en loginUrl. También se puede definir el timeout,
que es el tiempo que puede permanecer una página inactiva hasta que se desconecte
automáticamente y haya que volver a introducir los datos.
375
[Link] con C#
376
8: Protección y seguridad para [Link]. Personalización
8.2. Seguridad
Este apartado lo vamos a dedicar a hacer una aplicación, a través de la cual
conoceremos nuevos aspectos relacionados con la autenticación y bases de datos.
Para ello vamos a crearnos un nuevo proyecto al que vamos a llamar, por ejemplo,
seguridad. A continuación, vamos a acceder a la carpeta contenedora del nuevo
proyecto, para lo cual podemos acceder copiando la ruta. Posteriormente, vamos
a entrar en la carpeta de “Recursos de Seguridad” proporcionada al alumno. Al
descomprimir este archivo obtendremos tres carpetas: “Configuración”, “Formularios
e imágenes” y “Mapa”. En este caso vamos a abrir la de Formularios e imágenes, la
cual tiene otras dos carpetas: “Admin” e “Images”. Procedemos a copiar estas dos
carpetas y las pegamos en nuestro proyecto. Una vez realizado este paso vamos a
volver a Visual Studio y actualizamos el proyecto, que se realizaría en el explorador
de soluciones, pulsando sobre el botón de mostrar todos los archivos. Podemos
observar como aparecen las nuevas carpetas copiadas, pero salen de color blanco,
lo cual implica que para que formen parte del proyecto debemos pinchar con el botón
derecho sobre cada una de ellas y pinchar sobre “Incluir en el proyecto”.
377
[Link] con C#
Es importante recordar que para que esto que hemos hecho funcione debemos tener
activado SQL Server. En el caso de que nos salga este error “Error relacionado con la
red o específico de la instancia mientras se establecía una conexión con el servidor
SQL Server. No se encontró el servidor o éste no estaba accesible. Compruebe
que el nombre de la instancia es correcto y que SQL Server está configurado para
admitir conexiones remotas. (provider: SQL Network Interfaces, error: 26 - Error al
buscar el servidor o instancia especificado)” debemos hacer lo siguiente:
Inicio > Programas > Microsoft SQL Server 2008 > Configuration Tools >
Sql Server Configuration Manager > SQL Server Network Configuration > Protocols
for SQLEXPRESS > TCP/IP. Posteriormente pulsamos sobre el botón derecho,
propiedades y cambiar: Protocols > Enabled = true y además IP Address > IP ALL >
TCP Dynamic Ports = 1433.
SQL Server Services > SQL Server (EXPRESS) > Botón derecho, reiniciar.
Una vez hayamos podido abrir la página anterior volvemos de nuevo a Visual Studio.
Pinchamos sobre la carpeta App Data y en el mismo explorador de soluciones le
damos a ver todos los ficheros. Aparecerá un nuevo fichero “[Link]”. Si
ahora abrimos el fichero “[Link]”, observamos que aparece la siguiente cadena:
<connectionStrings>
<add name=”ApplicationServices”
connectionString=”data source=.\
SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|Dat
aDirectory|\[Link];User Instance=true”
providerName=”[Link]” />
</connectionStrings>
378
8: Protección y seguridad para [Link]. Personalización
Así de esta forma vamos a cambiar todas las etiquetas que se llamen ApplicationString
por SecurityConnectionString, y en la etiqueta que pone RoleManager cambiamos
“false” por “true”, quedándonos el código de la siguiente forma:
<?xml version=”1.0”?>
<!--
For more information on how to configure your [Link]
application, please visit
[Link]
-->
<configuration>
<connectionStrings>
<add name=”SecurityConnectionString”
connectionString=”data source=.\
SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|Dat
aDirectory|\[Link];User Instance=true”
providerName=”[Link]” />
</connectionStrings>
<[Link]>
<compilation debug=”true” targetFramework=”4.0” />
<authentication mode=”Forms”>
<forms loginUrl=”~/Account/[Link]”
timeout=”2880” />
</authentication>
<membership>
<providers>
<clear/>
<add name=”AspNetSqlMembershipProvider”
type=”[Link]” connecti
onStringName=”SecurityConnectionString”
enablePasswordRetrieval=”false”
enablePasswordReset=”true” requiresQuestionAndAnswer=”fal
se” requiresUniqueEmail=”false”
maxInvalidPasswordAttempts=”5”
minRequiredPasswordLength=”6”
minRequiredNonalphanumericCharacters=”0”
passwordAttemptWindow=”10”
applicationName=”/” />
</providers>
379
[Link] con C#
</membership>
<pages>
<namespaces>
<add namespace=”[Link]” />
<add namespace=”[Link]”/>
</namespaces>
</pages>
<profile>
<providers>
<clear/>
<add name=”AspNetSqlProfileProvider” type=”System.
[Link]” connectionStringName=”Secur
ityConnectionString” applicationName=”/”/>
</providers>
</profile>
<roleManager enabled=”true”>
<providers>
<clear/>
<add name=”AspNetSqlRoleProvider” type=”System.
[Link]” connectionStringName=”Secur
ityConnectionString” applicationName=”/” />
<add name=”AspNetWindowsTokenRoleProvider”
type=”[Link]”
applicationName=”/” />
</providers>
</roleManager>
</[Link]>
<[Link]>
<modules runAllManagedModulesForAllRequests=”true”/>
</[Link]>
</configuration>
<siteMap defaultProvider=”XmlSiteMapProvider”
enabled=”true”>
<providers>
<add name=”XmlSiteMapProvider”
380
8: Protección y seguridad para [Link]. Personalización
381
[Link] con C#
roles=”Administrador”>
<siteMapNode url=”~/Admin/Security/
[Link]” title=”Reglas de acceso”/>
<siteMapNode url=”~/Admin/Security/
[Link]” title=”Resumen de acceso de
seguridad”/>
<siteMapNode title=”Lista de usuarios”
roles=”Administrador”>
<siteMapNode url=”~/Admin/Security/Users.
aspx” title=”Usuarios por Nombre”/>
<siteMapNode url=”~/Admin/Security/
[Link]” title=”Usuarios por Rol”/>
<siteMapNode url=”~/Admin/Security/
[Link]” title=”Usuarios Activos/Inactivos”/>
<siteMapNode url=”~/Admin/Security/
[Link]” title=”Usuarios Online”/>
<siteMapNode url=”~/Admin/Security/
[Link]” title=”Usuarios Bloqueados”/>
</siteMapNode>
<siteMapNode url=”~/Admin/Security/AddUser.
aspx” title=”Añadir Usuario”/>
<siteMapNode url=”~/Admin/Security/[Link]”
title=”Mantenimiento de roles”/>
</siteMapNode>
</siteMapNode>
</siteMap>
Podemos observar que cada una de las url de “siteMapNode” coincide con cada
uno de los ficheros proporcionados en la carpeta de Admin/Security, donde también
podemos apreciar que en algunas etiquetas aparece roles al cual se le proporciona el
nombre de Administrador.
382
8: Protección y seguridad para [Link]. Personalización
Para cada código podemos ver su diseño. En este caso vemos el siguiente:
383
[Link] con C#
En este caso debemos seleccionar como origen de los datos “Mapa del sitio” y dejar
el nombre que se nos proporciona automáticamente y aceptamos. Seguidamente
pinchamos sobre el elemento “Ventana principal”. Además, tenemos que tener abierta
la vista de propiedades:
384
8: Protección y seguridad para [Link]. Personalización
385
[Link] con C#
Esta página es la página que nos aparecería. Vemos que si pinchamos en cada una
de las pestañas nos aparecen URL diferentes ([Link], [Link]). Si ahora
accedemos a la siguiente URL [Link]
(el número que acompaña a localhost en la dirección URL variará según el usuario),
veremos que nos aparece la siguiente ventana:
Podemos añadir el rol que nos parezca, por ejemplo, Administrador y aceptamos.
Nos damos cuenta de que se ha creado un nuevo rol. Este rol puede ser también
eliminado. Cada uno de los ficheros proporcionados al alumno de la carpeta Security
tiene una función, algunas de las cuales podemos usar ahora en esta página:
386
8: Protección y seguridad para [Link]. Personalización
En esta página podemos añadir tantos usuarios como queramos, así como eliminarlos
si creemos conveniente. Así que nosotros vamos a crear un nuevo usuario denominado
Usuario.
Para ver cómo se han creado los nuevos roles podemos acceder a la siguiente URL:
[Link] .
Ahora podemos dar de alta a los usuarios rellenando los campos que aparecen en la
pantalla:
387
[Link] con C#
Al rellenar todos los campos y darle al botón “Añadir Usuario” somos redireccionados
a la siguiente ventana:
388
8: Protección y seguridad para [Link]. Personalización
389
[Link] con C#
Toda vez que tenemos algún usuario registrado podemos darle a la función reglas
de acceso. Como se puede comprobar, aparece una descripción detallada sobre la
gestión de los niveles de seguridad y en el lateral un árbol con las diferentes páginas.
Si pinchamos sobre admin, podemos crear nuevas reglas sobre el rol de cada uno de
los usuarios. Por ejemplo, en la siguiente imagen se puede ver cómo hemos creado
una regla sobre el rol “Administrador” que le permita realizar el acceso a la aplicación
como administrador. Por lo tanto, el caso contrario sería denegar el acceso a todo
el resto de usuarios de la aplicación. Para ello seleccionamos la acción Denegar y
aplicamos la regla a todos los usuarios.
Como se puede apreciar en la imagen, al lado de cada regla aparecen dos botones,
subir y bajar. Estos dos botones se usan para subir una regla o bajarla. Esto quiere
decir que según el orden en el que estén colocadas las reglas se aplican de una
manera u otra, puesto que éstas se aplican en orden y es por eso por lo que primero
390
8: Protección y seguridad para [Link]. Personalización
hemos creado los permisos para el administrador y luego para todos los usuarios
(entre los que también se encuentra el administrador), lo que implica que al estar ya
creada la regla para el administrador, todas aquellas que se creen después no le van
a afectar.
Para ver el funcionamiento más concretamente vamos a cerrar la sesión que tenemos
abierta y volvemos a Visual Studio y agregamos una nueva carpeta al proyecto
(recordamos que con el botón derecho pulsamos sobre el nombre del proyecto y le
damos a añadir nuevo elemento). Llamemos a esta carpeta Users.y vamos a iniciar la
depuración, lo cual nos lleva a abrir de nuevo la aplicación en el navegador e iniciamos
sesión con el nombre al cual le dimos los mayores privilegios anteriormente, es decir,
como administrador. Si le damos a Reglas de Acceso, se observa como aparece en
el árbol de la izquierda la carpeta que nos acabamos de crear. Si pinchamos sobre
ella, podemos crear nuevas reglas y vamos a crearnos una para el rol Usuario que le
permita acceder al directorio que aparece y otra regla que deniegue el acceso a los
demás. Si cerramos la sesión e intentamos entrar ahora con el segundo perfil que
nos creamos anteriormente como Usuario, vemos que la pantalla es distinta a la del
administrador, puesto que ésta carece de los permisos que sí tiene la otra.
391
[Link] con C#
Al pinchar sobre Tablas vemos que se despliega un menú con diferentes tablas, a las
cuales le podemos agregar las que queramos pinchando sobre el botón derecho y
agregar nueva tabla apareciendo lo siguiente:
En esta nueva tabla declaramos el nombre de cada columna, el tipo de datos que
usa y si permite valores nulos. Procedemos a rellenar los campos con el nombre
UserId, de tipo int y que no permita valores nulos. Podemos observar como en la fila
de abajo aparecen una serie de propiedades de la columna creada. Hay que cambiar
una propiedad en “Especificación de la Identidad” y donde pone (Identidad) debemos
poner que Sí en vez de No.
392
8: Protección y seguridad para [Link]. Personalización
Luego podemos crear todas las columnas que queramos. Nosotros, además, vamos
a usar una tabla que ya está hecha, que es la de aspnet_Users y vamos a crear una
serie de columnas tal y como aparece en la imagen:
Vemos que aparecen una serie de tipos de datos que por su nombre podemos deducir
qué valores permite. Uniqueidentifier nos permite darle un identificador único, Int solo
valores enteros y varchar nos permite campos alfanuméricos y el número que aparece
entre paréntesis es el tamaño máximo que puede alcanzar ese campo.
Ahora vamos a proceder a administrar los índices y claves pulsando sobre el siguiente
botón:
393
[Link] con C#
Vamos a añadir una nueva tabla, la cual tiene un nombre y una serie de columnas que
casualmente son las que hemos creado.
394
8: Protección y seguridad para [Link]. Personalización
Las relaciones entre tablas nos dan la opción de vincular ciertas características
comunes a varias tablas para mantener una integridad relacional entre ellas. Vamos
a proceder a crear relaciones entre tablas dándole al botón agregar, apareciendo la
siguiente ventana:
395
[Link] con C#
Después de todo esto guardamos y le damos un nuevo nombre a la tabla, por ejemplo,
Users y decimos que sí queremos continuar.
Al pulsar con el botón derecho sobre la tabla aspnet_Users que aparece en el menú
seleccionamos la opción “Mostrar datos de tabla”. Los datos que aparecen son los
que hemos registrado a través de la aplicación con los campos que hemos incluido,
apareciendo el UserId y applicationId encriptados.
Al abrir la tabla Users que nos creamos anteriormente, vemos que aparece vacía,
pero está relacionada a través de su columna UserId con la tabla aspnet_Users. Para
poder apreciar la relación entre tablas vamos a copiar el campo UserId de cualquier
entrada de la tabla aspnet_Users y lo vamos a pegar en la tabla Users en la columna
aspnet_Users pues es ésta la que está relacionada. Podemos rellenar el resto de
campos con los datos que creamos conveniente siempre que cumplan los criterios
impuestos sobre el tipo de datos.
396
8: Protección y seguridad para [Link]. Personalización
Si se intenta copiar el mismo UserId para distintos registros, Visual Studio nos va
a lanzar un mensaje de error, puesto que previamente habíamos declarado que el
campo UserId iba a tener un identificador único:
Por lo tanto, debemos cambiar el UserId del segundo registro. Podemos cerrar las
tablas e iniciamos la depuración y ya en el navegador aparece la aplicación, en la cual
vamos a iniciar sesión como Administrador.
Vamos a ver la lista de usuarios por nombre. Al pinchar sobre cualquiera de ellos nos
aparece la siguiente página con la información relativa al usuario seleccionado:
397
[Link] con C#
A la hora de crear una aplicación de este tipo es muy importante saber manejar algunos
conceptos de bases de datos y tener muy claro qué es lo que se necesita, qué juego
de datos va en cada tabla y cómo se relacionan entre ellas.
398
8: Protección y seguridad para [Link]. Personalización
Para poder crearnos nuestro propio proveedor de suscripciones hay que implementar
los siguientes métodos y propiedades:
399
[Link] con C#
Se pueden utilizar tanto un método para encriptar como para desencriptar, para los
cuales tenemos respectivamente EncryptPassword y DecryptPassword.
400
8: Protección y seguridad para [Link]. Personalización
Vamos a ver cómo habría que incluir todas estas propiedades dentro del método
Initialize:
if (config == null)
throw new ArgumentNullException(“config”);
if ([Link](config[“description”]))
{
[Link](“description”);
[Link](“description”, “Sample ODBC
Membership provider”);
}
[Link](name, config);
pApplicationName = GetConfigValue(config[“applicati
onName”],
[Link].
[Link]);
pMaxInvalidPasswordAttempts = Convert.ToInt32(Get
ConfigValue(config[“maxInvalidPasswordAttempts”], “5”));
pPasswordAttemptWindow = Convert.ToInt32(GetConfig
Value(config[“passwordAttemptWindow”], “10”));
pMinRequiredNonAlphanumericCharacters = Convert.
ToInt32(GetConfigValue(config[“minRequiredNonAlphanumericCh
401
[Link] con C#
aracters”], “1”));
pMinRequiredPasswordLength = Convert.ToInt32(GetC
onfigValue(config[“minRequiredPasswordLength”], “7”));
pPasswordStrengthRegularExpression = [Link]
ring(GetConfigValue(config[“passwordStrengthRegularExpressi
on”], “”));
pEnablePasswordReset = [Link](GetConfig
Value(config[“enablePasswordReset”], “true”));
pEnablePasswordRetrieval = [Link](GetC
onfigValue(config[“enablePasswordRetrieval”], “true”));
pRequiresQuestionAndAnswer = [Link](Ge
tConfigValue(config[“requiresQuestionAndAnswer”], “false”));
pRequiresUniqueEmail = [Link](GetConfig
Value(config[“requiresUniqueEmail”], “true”));
pWriteExceptionsToEventLog = [Link](Ge
tConfigValue(config[“writeExceptionsToEventLog”], “true”));
switch (formato)
{
case “Hashed”:
pPasswordFormat = MembershipPasswordForma
[Link];
break;
case “Encrypted”:
pPasswordFormat = MembershipPasswordForma
[Link];
break;
case “Clear”:
pPasswordFormat = MembershipPasswordForma
[Link];
break;
default:
throw new ProviderException(“Password for
mat not supported.”);
}
}
402
8: Protección y seguridad para [Link]. Personalización
defaultValue)
{
if ([Link](configValue))
return defaultValue;
return configValue;
}
403
[Link] con C#
return pEnablePasswordRetrieval;
}
}
404
8: Protección y seguridad para [Link]. Personalización
}
public override MembershipPasswordFormat
PasswordFormat
{
get
{
return pPasswordFormat;
}
}
405
[Link] con C#
Como podemos observar, tenemos las propiedades vistas arriba más algunas
propiedades que sirven para perfeccionar la forma en la que debemos introducir la
contraseña. Al principio tenemos que definir las propiedades y asignarles el valor
predeterminado que queremos, como por ejemplo, asignar un número máximo de
intentos o el modo en el que guardamos las contraseñas. Después tenemos que
generar los get y set para cada una de las propiedades. Hemos obviado algunos
elementos correspondientes a la configuración.
406
8: Protección y seguridad para [Link]. Personalización
Existen otros métodos como encontrar a los usuarios por nombre o por email o
simplemente para desbloquear una cuenta previamente bloqueada por algún ataque
a una de las cuentas. Las combinaciones de todos estos métodos son muchísimas,
pero es verdad que cuantos más métodos y propiedades usemos, más completa y
variada será nuestra página.
Todos los métodos vistos arriba son más complejos de codificar puesto que utilizan
estructuras que no hemos visto durante el curso. Eso sí, gracias a estos métodos
implementados por [Link] no es necesario implementarlos más ya que una vez
hechos pueden ser reutilizados constantemente para distintas páginas, aunque como
hemos dicho antes, podemos crear nuestro propio proveedor de usuarios de manera
personalizada añadiendo o eliminando métodos. La solución propuesta por la propia
tecnología [Link] y Microsoft es la siguiente y puede ser encontrada en la siguiente
página:
[Link]
Como ya hemos comentado, es un código muy extenso, pero muy útil. Es muy
recomendable echar un vistazo y entender bien los métodos, puesto que muchos de
ellos los podemos reutilizar y modificar para crear nuestras propias reglas a la hora de
dar de alta a los usuarios o de mantener la seguridad de los mismos. Como se puede
observar, hay muchos métodos muy similares y que utilizan las mismas estructuras
para atrapar excepciones.
Es algo notorio que cada empresa o página tiene unas credenciales de usuario distintas
e incluso tecnologías distintas para implementar la creación de cuentas de usuario. Por
ejemplo, hay páginas que solicitan muchos de nuestros datos personales, algunos de
ellos incluso hay que ponerlos de forma obligatoria y otros de forma opcional y otras
páginas que solo se bastan de un nombre de usuario, una contraseña y una cuenta
de correo. Si queremos registrarnos, por ejemplo, en una cuenta de alguna tecnología
perteneciente a Microsoft, estaremos utilizando todas las propiedades vistas arriba y si
estamos dándonos de alta en alguna cuenta perteneciente a otra página, tendremos
otras opciones, como por ejemplo a la cuenta de usuario de un banco, donde el
número de intentos para acceder a una cuenta es mucho menor que en cualquier otro
tipo de cuentas.
407
8: Protección y seguridad para [Link]. Personalización
RESUMEN
■ En esta unidad hemos visto los tres tipos de servicios de seguridad.
■
Los servicios de usuario son los que más nos interesan y en ellos se encuadra la
utilización de autenticación y validación de usuarios. Para ello hemos aprendido una
nueva etiqueta, asp:login.
■
Para manejar una aplicación el programador es el que decide los privilegios de cada
uno de los usuarios, permitiendo o denegando acceder a ciertos contenidos de la
misma.
■
A la hora de crear una aplicación de este tipo es muy importante saber manejar algunos
conceptos de bases de datos y tener muy claro qué es lo que se necesita, qué juego
de datos va en cada tabla y cómo se relacionan entre ellas.
409









