22
GUIA DE APRENDIZAJE NO. 015 EJEMPLO GENERAL SOBRE PAGINA DE BIBLIOTECA CON ASISTENTE DE TAREAS INSTRUCTOR: Ing. Ariel Almonacid Arias AREA: Programación en ASP.NET. ESTUDIANTE: _____________________________________________________. GRADO: ___________. OBJETIVOS: Dar a conocer al estudiante la manera rápida y fácil de generar una aplicación Web sin muchas complicaciones mediante el uso de DataSet con sus respectivas entidades de negocio ”DataTables” usando además controles como el ContenPlaceHolder, LoginView, GridViews, DetailsView. CONTENIDOS Para este ejemplo vamos a crear un sitio web: Archivo, Nuevo, Sitio Web, Empty Web Site(Sitio Web Vacío). Agregamos a nuestro nuevo proyecto una base de datos llamada Biblioteca y en ella agregamos 2 tablas así: La primera: Observen que los valores no se declaran nulos. En el campo copias declarado como int, en sus propiedades de columna(parte inferior), colocamos 0 en la opción valor o enlace predeterminado y a esta tabla la nombraremos como Libros.

compumakia.files.wordpress.com … · Web viewUn punto, coma, etc; para mí ejemplo los usuarios son: Andrea y la contraseña para los dos es almonacid.0) ahora estos usuarios quedarán

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: compumakia.files.wordpress.com … · Web viewUn punto, coma, etc; para mí ejemplo los usuarios son: Andrea y la contraseña para los dos es almonacid.0) ahora estos usuarios quedarán

GUIA DE APRENDIZAJE NO. 015

EJEMPLO GENERAL SOBRE PAGINA DE BIBLIOTECA CON ASISTENTE DE TAREAS

INSTRUCTOR: Ing. Ariel Almonacid Arias

AREA: Programación en ASP.NET.

ESTUDIANTE: _____________________________________________________.

GRADO: ___________.

OBJETIVOS: Dar a conocer al estudiante la manera rápida y fácil de generar una aplicación Web sin muchas complicaciones mediante el uso de DataSet con sus respectivas entidades de negocio ”DataTables” usando además controles como el ContenPlaceHolder, LoginView, GridViews, DetailsView.

CONTENIDOS

Para este ejemplo vamos a crear un sitio web:

Archivo, Nuevo, Sitio Web, Empty Web Site(Sitio Web Vacío).

Agregamos a nuestro nuevo proyecto una base de datos llamada Biblioteca y en ella agregamos 2 tablas así:

La primera:

Observen que los valores no se declaran nulos.

En el campo copias declarado como int, en sus propiedades de columna(parte inferior), colocamos 0 en la opción valor o enlace predeterminado y a esta tabla la nombraremos como Libros.

Ahora creamos una segunda tabla llamada Préstamos así:

Cuando creemos la llave primaria Id_Prestamo(esta clave será artificial porque no estará asociada a ninguna entidad física-automatica) y vamos a hacer que sea la base de datos la que gestione la unicidad así:

Page 2: compumakia.files.wordpress.com … · Web viewUn punto, coma, etc; para mí ejemplo los usuarios son: Andrea y la contraseña para los dos es almonacid.0) ahora estos usuarios quedarán

En las propiedades de la columna del campo(parte inferior) Id_Prestamo, abrimos las opciones de especificación de identidad, y en (Identidad) colocamos SI.

En las propiedades de la columna del campo Devuelto, colocamos 0 en la opción Valor o Enlace Predeterminado, todo quedaría así:

Posteriormente en el explorador de servidores, damos click derecho en Diagrama de Base de Datos, Agregar Nuevo Diagrama, (si en el mensaje de crearlo o no), agrego las dos tablas, genero la relación entre Id_Libro de la tabla Libros con Id_Libro de la tabla Prestamos, quedando así:

Guardamos y damos el nombre al diagrama como Diagrama.

Ya creado el modelo de datos cerramos este y vamos al explorador de servidores, click derecho sobre la tabla Libros, mostrar datos de la tabla y empezamos a llenarlos(en Id_Libro colocamos 10 ceros, y en Caratula colocamos por ejemplo:1.jpg[esta imagen al igual que las demás se agregan al proyecto dentro de una carpeta llamada Imágenes]).

Luego mostramos los datos de la tabla Prestamos y empezamos a llenarla, observe que en el campo Id_Prestamo aparecerá como Null, ya que como lo indique anteriormente es un campo de identidad y se generara ascendentemente de manera automática.

Page 3: compumakia.files.wordpress.com … · Web viewUn punto, coma, etc; para mí ejemplo los usuarios son: Andrea y la contraseña para los dos es almonacid.0) ahora estos usuarios quedarán

Ahora vamos a desarrollar el esqueleto visual de mi aplicación mediante el uso de páginas maestras(sirven de plantilla general que proveerá a la aplicación un diseño estándar para todas los formularios web de la página, es decir centralizar en un mismo sitio la disposición de todos los elementos visuales del proyecto(esta página maestra la puedo modificar sin alterar el contenido de mis demás sites), Nota: mi proyecto puede tener más de una página principal o Master Page):

Ya generada la carpeta Imágenes con sus respectivas imágenes, damos click derecho sobre el proyecto y agregamos nuevo elemento, Página Principal, la nombramos(Plantilla), dejamos el checkbox activado(colocar el código en un archivo independiente). En el código interfaz de usuario generado eliminamos el control que me pone por defecto el ContentPlaceHolder el asistente de la aplicación:

Vamos a diseño, en el cuadro de propiedades debo estar ubicado en DOCUMENT, luego voy al menu Tabla, Insertar Tabla, 2 filas y 3 columnas, ancho 100%; luego combino las celdas 5 y 6(click derecho, modificar, combinar celdas).

A las primeras 3 celdas(las de la parte superior), se le insertan controles Images con sus respectivas URL(Esta será la cabecera); en la celda 4 que será nuestra sección de menús(generemos un color de fondo[propiedad bgcolor]); dentro de la 4 celda y la celda combinada vamos a añadir otra tabla de 1 columna y 1 fila(en espaciado entre celdas le damos 5, en ancho 100); en la zona de menús(tabla de la celda 4) agregamos un textbox(Id: tbBusqueda) y un button(Buscar, Id: btBusqueda[servirá como

Page 4: compumakia.files.wordpress.com … · Web viewUn punto, coma, etc; para mí ejemplo los usuarios son: Andrea y la contraseña para los dos es almonacid.0) ahora estos usuarios quedarán

filtro para consultar por títulos de libros]), en las propiedades de esta tabla <TD>, vamos a Style-Bloque-VerticalAlign=Top “para que sus controles queden en la parte superior”; ahora añadiremos en la tabla de las celdas combinadas un control especial que es el ContentPlaceHolder(que sera el espacio reservado para el contenido de las demas paginas o formularios de la aplicación[elementos visuales]); ahora creamos los formularios que iran en el ContentPlaceHolder(al momento de seleccionar el Web form activemos el checkbox: seleccionar la pagina principal), seleccionamos la plantilla master pages y agregar; se genera un codigo interfaz de usuario(en este codigo ponemos el cursor en la etiqueta @ Page), en el cuadro de propiedades seleccionamos <PAGE>, y le damos un titulo a la pagina en la opcion Title “Registro de Libros”, luego vamos a diseño(observemos que todo lo que esta por fuera del control ContentPlaceHolder esta inhabilitado), escribamos en este control Colección de Libros; asi tambien agregamos el formulario para la pagina de Prestamos colocando en su title”Prestamos”, (tambien podemos poner el titulo dentro de las opciones de DOCUEMENTS en propiedades), y en el ContentPlaceHolder digitamos “Detalle de Libros mas Prestamo de Libros”, tambien agregemos un formulario llamado MisPrestamosPendientes, damos su title, y dentro del ContentPlaceHolder digitamos “Prestamos de Libros Pendientes por Devolver”

Ahora incorporaremos a la aplicación una pequeña capa logica de datos y configurareros el acceso a la base de datos, hay diferentes tecnicas para definir las entidades de negocio de nuestra aplicacion, en .Net podemos utilizar XML, clases propias, tipos expecificos de .Net como son DataSets, DataSets tipados, etc, pero , en nuestro ejemplo vamos a utilizar DataSet para definir y DataAdapters para enlazar la entidades de negocio con la base de datos, las entidades de negocio seran elementos contenidos en los DataSet como son los DataTables, concretamente vamos a crear 3 DataSets(uno para libros(formulario Default), otro para prestamos pendientes(formulario prestamos pendientes), y otro para el detalle de libros mas prestamos de libros(Formulario Prestamos)), aquí cada DataSet va a definir una unica entidad, es decir un DataTable y su correspondiente DataAdapter para rellernar y actualizar cambio en esa entidad, antes de construir estos DataSets vamos a añadir un nuevo elemento(fichero de configuracion(web config) para definir los parametros que van a afectar a nuestra aplicación en tiempo de ejecución), por defecto hay dos parametros fijados que son:

<compilation debug="true">

Refleja el modo de depuración de ASP y,

<authentication mode="Windows"/>

Que me da el modo de selección de autenticación(generalmente Windows).

La herramienta ASP configuration es la que nos va a permitir configurar los parámetros de nuestra aplicación.

Ahora vamos a crear el primer DataSet, agregamos un nuevo elemento y añadimos un DataSet con nombre LibrosDS(este contendrá la entidad de películas que será un DataTable y un DataAdapter), aceptar y decimos que sí crear la carpeta de los códigos de los DataSets, pasamos al cuadro de herramientas que estará ya con la información de los DataSets, agregamos un Table Adapter(en la nueva ventana, escojo la base de datos y también podemos ver en esta la cadena de conexión de la base de datos), damos siguiente y luego me pregunta si se quiere guardar esa cadena de conexión dentro del fichero de configuración con el nombre del parámetro(se puede modificar), para el ejemplo dejémoslo así, damos siguiente, luego el asistente nos pide que tipos de comandos vamos a utilizar en el TableAdapter(el cual como ya se dijo enlaza nuestra entidad de negocios con la base de datos), seleccionamos (usar instrucciones SQL) y siguiente; vamos al generador de consultas y agregamos la tabla Libros (que será la entidad de negocio que vamos a manejar internamente en nuestra aplicación), seleccionamos todos los campos(menos el de todas las columnas); aceptar; ahí podemos manipular las opciones avanzadas [recordemos que estamos en un modelo de acceso a datos desconectado [DataSet] (es decir en el momento de rellenar nuestra entidad de negocio, es decir el DataTable, el adaptador abre la conexión, realiza las sentencia Select, rellena y cierra de nuevo la conexión) es decir, inserta, modifica, elimina y todo esto solo en memoria, pero si queremos sincronizarnos con la base de datos tendríamos que hacer un Update sobre la entidad de negocios para que la base de datos asimile los cambios, dentro de este se abre la conexión y se hacen las sentencias de inserción, actualización o borrado, luego se cierra de nuevo la conexión], activamos las 2 primeras opciones:

Page 5: compumakia.files.wordpress.com … · Web viewUn punto, coma, etc; para mí ejemplo los usuarios son: Andrea y la contraseña para los dos es almonacid.0) ahora estos usuarios quedarán

Siguiente, Luego, el asistente nos pide que nombres queremos dar a los métodos que nos permitan rellenar nuestras entidades en nuestro DataSet, el método Fill lo que hace es a pasar siempre por parámetro el DataSet, ir pasando todos los datos que se están recuperando de las tablas que se han ido rellenando (método ineficiente para recuperar), por ello es mejor utilizar el método GetData (devuelve los datos para hacer lo que queramos), la tercera opción permite crear métodos que envían actualizaciones directamente a la base de datos, crea el método Update mencionado anteriormente con sus sentencias de sincronización con la base de datos de manera controlada, damos siguiente con los tres métodos seleccionados, y finalizamos.

Al seleccionar el campo LibrosTableAdapter, en el panel de propiedades se pueden distinguir las modificaciones que se ha realizado(sentencias insert, delete, etc); este adaptador nos devolvería todos los libros para mostrarlos en la biblioteca, pero podemos generar sentencias adicionales como puede ser buscar libros por título así:

En el campo en donde se generó el adaptador (en nuestro ejemplo LibrosTableAdapter), click derecho y añadir más consultas:

Page 6: compumakia.files.wordpress.com … · Web viewUn punto, coma, etc; para mí ejemplo los usuarios son: Andrea y la contraseña para los dos es almonacid.0) ahora estos usuarios quedarán

Añadimos una sentencia SQL que nos devuelva filas, voy al generador de consultas para hacer el filtrado y después de los registros de la tabla Libros agrego otro registro como filtro así:

Upper es para no tener problemas con mayúsculas y minúsculas y

Like indica que el registro sea como cualquier cosa que contenga el parámetro del filtro del título(es decir, con una sola palabra que haga parte del título él lo mostrara Ejemplo: digitamos la y el busca los títulos de libros que tengan ese parámetro), aceptar, siguiente, cambiamos el FillBy por FillByFiltroTitulo(para ordenamiento nuestro) y el GetData por GetDataFiltroTitulo.

Ahora vamos a generar una consulta que mostrara todos los campos de Libro dada su clave, así:

Click derecho sobre el Adapter, agregar consulta, siguiente, siguiente, generador de consultas, añadimos el filtro de Id_libro asi:

Page 7: compumakia.files.wordpress.com … · Web viewUn punto, coma, etc; para mí ejemplo los usuarios son: Andrea y la contraseña para los dos es almonacid.0) ahora estos usuarios quedarán

Luego damos aceptar, siguiente, creamos los métodos FillById_libro y GetDataById_libro.

Ya con esto tenemos el adaptador con las consultas necesarias para la funcionalidad que requiero,

Nota Extra(no aplicar en ejemplo): si lo que queremos es crear DataSets multientidad(también se puede con una sola entidad), click derecho sobre el espacio de diseño, agregar, DataTable (se crearía la entidad y su adaptador correspondiente y hacer las consultas correspondientes), con el agregue de Relatión (puedo establecer relaciones, ya que al fin y al cabo DataSet es una minibase de datos en memoria).

Guardamos nuestra primera entidad y en el archivo WebConfig verificamos que se ha generado nuestra cadena de conexión:

<add name="BibliotecaConnectionString" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\Biblioteca.mdf;Integrated Security=True;User Instance=True"providerName="System.Data.SqlClient" />

Ahora añadamos los siguientes DataSets restantes: click derecho en la carpeta App_Code, agregar nuevo elemento, nombramos al DataSets(PrestamosDS, esta será la entidad y se usa para insertar un nuevo registro de préstamo de libros cuando un usuario lo pida prestada), vamos al cuadro de herramientas, agregamos con doble click el TableAdapter(observemos que la cadena de conexión ya me la genera desde el Webconfig), siguiente, escogemos la tabla Prestamos, todos los campos, en opciones avanzadas activamos (actualizar la tabla de datos, debido a que algunos campos tienen generación automática como lo es Id_Prestamo por tal razón necesitamos refrescar la base de datos), no es necesario usar la concurrencia optimista ya que lo único que voy a hacer son inserciones de libros, generamos los métodos así como están, y terminamos de generar los pasos siguientes, ojo vamos guardando todo. Ahora creemos el DataSets para prestamodelibrosDS al igual que lo hecho anteriormente(el DataTable o entidad de negocio es especial ya que lo único que quiero es mostrar los prestamos pendientes mostrando al usuario la fecha de préstamo y el título del libro pendiente por devolver), por ello la sentencia será compuesta, solo chequemos la fecha del préstamo y el título del libro, ahora filtramos por socio así:

Page 8: compumakia.files.wordpress.com … · Web viewUn punto, coma, etc; para mí ejemplo los usuarios son: Andrea y la contraseña para los dos es almonacid.0) ahora estos usuarios quedarán

Observen que solo se chulean Fecha_Prestamo y Titulo en las tablas, se agregaron 2 columnas Usuario de Tabla Prestamos y Devuelto de Tabla Prestamos(el filtro =0 es para que muestre el valor boolean false, es decir los que no han devuelto libros), en opciones avanzadas desactivo todo ya que no necesitamos de insert y demás, ya que el adaptador quedaría de un solo sentido(entidad de negocio de solo lectura), nombramos los métodos así (FillByUsuario y GetDataByUsuario), ahora como estamos tomando los datos de 2 tablas necesitamos renombrar ese DataTable para darle nombre a la entidad y asi usarlo en la aplicación; ya hemos terminado nuestros Datasets, entidades de negocios y enlazadas a través de la configuración que hemos realizado. Por ultimo compilamos para ver que no haya ningún error.

Nos ubicamos en la página por defecto (Deaful.aspx), borramos Colección de Libros del ContenPlaceHolder, arrastramos a este un control GridView(rejilla de datos, Width=100%) y un Label(Text vacío e ID LInfoBusqueda); al GridView le damos un formato profesional así:

Damos click en la flechita de tareas del GriidView

Luego formato automático, escogemos el formato profesional, aceptar.

Ahora vamos a asociar este GridView a las entidades de negocio ya creadas por medio del mismo asistente de tareas del GridView en la opción elegir origen de datos, en nuestro caso vamos a enlazarlo a un objeto(Object), escogemos el de LibrosDSTableAdapter, siguiente, para nuestro ejemplo no vamos a utilizar UPDATE, INSERT Y DELETE, por eso vamos a desactivarlas poniendo ninguno en la opción elegir un método ya que lo único que queremos es mostrar los libros, en SELECT dejamos el método GetData()Devuelve LibrosDataTable y finalizamos.

Voy de nuevo al asistente del GridView, editar columnas, con la X roja elimino los campos que no quiero usar, incluso caratula(ya que esta enlazado directamente con la base de datos y lo que quiero mostrar es realmente son imágenes); para ello agrego un campo ImageField (en la propiedad Header Text=Caratula y en DataImageUrlField=Caratula, campo creado en la base de datos[el cual contiene los ficheros de las imágenes], y en DataImageUrlFormatString= ~/Imágenes/{0} )

Ahora realizaremos modificaciones en mi página Default para que podamos clickear en la columna de títulos sobre un título lo cual nos mostrara el detalle del libro y un botón para prestarlo de la biblioteca así:

Primero pondremos los textos de la cabecera alineados ala izquierda, vamos al editor de columnas del control GridView, eliminamos el campo título, agregamos en la parte superior de los campos un campo de plantilla(TemplateField) que voy a poder configurar, le damos en Header Text =“Titulo”, alineamos todos los textos horizontales a la izquierda con Header Style, HorizontalAling=”left” (esto mismo hacemos con los otros campos que en nuestro ejemplo deben ser caratulas y descripción), coloco en negrita el título para que resalte;.

Ahora editaremos la primer columna del GridView gracias a la plantilla adicionada así: ingresamos al asistente de tareas del GridView y damos click en la parte final “Editar Plantillas”, en esta parte podremos ingresar controles,texto y demás ala única plantilla creada que es la del título, entonces añadamos un control HiperLink, editamos los enlaces de datos en el asistente de tareas de dicho control, en la propiedad Text le decimos que nos muestre el Titulo y en NavigateUrl le decimos que el vínculo

Aquí en esta flechita

Page 9: compumakia.files.wordpress.com … · Web viewUn punto, coma, etc; para mí ejemplo los usuarios son: Andrea y la contraseña para los dos es almonacid.0) ahora estos usuarios quedarán

será a la página Prestamos, para ello pasamos el Id_libro para la QueryString(consulta de cadena), es decir en Bound to (con enlace a)=”Id_libro” y en format (formato)=” ~/Prestamos.aspx?Id_libro={0}”, listo el enlace ya queda definido y finalizamos la edición de plantilla usando de nuevo la flechita del asistente de Plantilla y terminar edición de plantilla, hagamos una prueba de mi página para ver cómo vamos, debe pasarnos del formulario Default al formulario Prestamos con cualquier vínculo.

Nota: para reducir o ampliar las columna de un GridView es: asistente de tareas, Editar Columnas, ItemStyle (Font, With”agrego en porcentaje lo que deseo”).

Ahora vamos a la plantilla “página maestra”, seleccionamos el Button Buscar Libros, vamos a ala propiedad PostBackUrl (permite redireccionar automáticamente a otra página), escogemos Default; pasamos de nuevo a la página Default y vamos a determinar si al cargar la página va o no con filtro, para ello vamos a la lógica de aplicación de la página, en la parte superior escogemos Page eventos y a la derecha Load para ingresar al evento Load de la página, y generamos el siguiente código con el propósito de que realice las búsquedas por parámetro definidas en los DataSets:

Partial Class _Default Inherits System.Web.UI.Page

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LoadDim txtBusqueda As String = ""If Me.PreviousPage IsNot Nothing Then 'Determina si venimos de una pagina distinta a la que estamos y si es asi podemos navegar por loscontroles en este caso el tbBusqueda que esta en la plantilla master, ya que se guarda una copia del estado de la pagina anterior

txtBusqueda = DirectCast(Me.PreviousPage.Master.FindControl("tbBusqueda"), TextBox).Text'hemos buscado el textbox"tbBusqueda" de la plantilla maestra y lo que tenga me lo devulve en la variable txtBusqueda

ElsetxtBusqueda = DirectCast(Me.Master.FindControl("tbBusqueda"), TextBox).TextEnd If'sino entonces busca la pagina actual

ObjectDataSource1.SelectParameters.Clear()'Es para no cargar el DataSet con multiples filtros ya que podria generar un error al ejecutar el metodo Selectlo que hacemos es borrar la lista de parametros

If String.IsNullOrEmpty(txtBusqueda) ThenObjectDataSource1.SelectMethod = "GetData"'Determino que si ese texto es vacio entonces hago la busqueda y le indico que el metodo que va a utilizar paraobtener los datos es el GetData(que tiene todos los registros de libros capturados en el formulario Default).

LInfoBusqueda.Text = "Resultado de la lista de libros sin filtro"'LInfoBusqueda es el Label que muestra la cadena de texto anterior

Else

ObjectDataSource1.SelectMethod = "GetDataFiltroTitulo"'Si viene con texto ese TextBox entonces la query utiliza el filtro(GetDataFiltroTitulo(busqueda por cualquierparametro"palabra que pertenezca al titulo del libro"))

ObjectDataSource1.SelectParameters.Add("FiltroTitulo", txtBusqueda)LInfoBusqueda.Text = "Resultado de la lista de libros con filtro""" + txtBusqueda + """"

End If

Page 10: compumakia.files.wordpress.com … · Web viewUn punto, coma, etc; para mí ejemplo los usuarios son: Andrea y la contraseña para los dos es almonacid.0) ahora estos usuarios quedarán

End SubEnd Class

Ahora desplacémonos al formulario Prestamos.aspx , agregamos un control DetailsView(With=100%), un Button(Id=BPrestamo, Text=Prestar), y un Label(Id=LMensage, , Text=vacío, Visible=False); al control DetailsView le podemos dar mediante el asistente de tareas un formato profesional, como origen de datos agregamos un objeto(el mismo ObjectDataSource1) en el objeto comercial escogemos LibrosDS, el método será GetDataById_libro(Update, Insert y Delete[ninguno]), siguiente, en origen de parámetro escojo QueryString, en QueryStringField colocamos Id_libro, finalizamos y ya tendremos nuestro detalle, luego con el asistente de tareas voy a la opción editar campos(Edit Fields), al igual que antes elimino el campo Caratula y agrego uno nuevo llamado ImageField(en propiedades no titulo la cabecera en Header Text, en DataImageUrlField=Caratula, en DataImageUrlFormatString=~/Imágenes/{0} ), aceptar, colocamos en negrilla tanto el campo título como el de descripción(ItemStyle, Font, Bold=True), si al compilar arroja error, debemos establecer al formulario Default como página de inicio de nuevo.

Por el momento vamos a dejar pendiente la lógica de aplicación del button Prestar ya que para ello debemos incorporar primero la autenticación de usuarios ya que el préstamo exige que el usuario este auntenticado.

Entonces vamos al formulario PrestamosPendientes, borramos el contenido del ContentPlaceHolder, y agregamos un control GridView(regilla de datos[With=100%, formato profesional, origen de datos ObjectDataSource1, Objeto Comercial=PrestamosLibrosDS; escogemos el único método generado; Update, Insert y Delete se dejan como están; siguiente; en Valor por defecto escribamos Ariel “un usuario registrado en la base de datos, tabla Prestamos”]); ahora editamos las columnas del GridView”with=75%, HorizontalAlign=Left”; carguemos la página con el formulario PrestamosPendientes por defecto y me mostrara el préstamo pendiente del usuario Ariel.

ASP.NET 2.0 agrego un mecanismo de autenticación llamado Membership que permite manejar controles adicionales para esta autenticación.

Para empezar arrancamos una herramienta de configuración web que permitirá configurar parámetros de seguridad del fichero Web Config, también podremos especificar el proveedor de servicios de aplicación de ASP.NET.

Ahora activaremos o configuraremos la seguridad de la aplicación así:

Vamos al menú SitioWeb, Configuración Asp.Net, (abre inmediatamente la página web de administración), click en pestaña de seguridad, arrancamos el asistente para configuración de seguridad paso a paso, siguiente, seleccionamos el método de acceso desde internet(ya que lo que queremos es generar la aplicación desde internet, esto lo que hará es cambiar en el fichero de configuración el modo de autenticación Windows por modo de autenticación Forms), siguiente, en configuración de proveedores avanzado (Nota: existen varios como Membership “se encarga de toda la autenticación de usuarios”, otros como el gestor de errores, personalización, Cachin de base de datos; todos vienen por defecto en ASP.NET 2.0, en si son modelos de datos soportados por motores de base de datos como SQL SERVER, SQL SERVER ESSPRES), cómo no vamos a utilizar un modelo de datos distinto al que viene por defecto en el servicio de Membership, ni ninguna base de datos distinta a SQL SERVER ESSRES, entonces damos click en siguiente, no definimos funciones, siguiente, (ahora podemos crear los usuarios que podrán acceder a la aplicación), agreguemos 2 usuarios(Nota: la contraseña de los usuarios debe tener más de 7 caracteres y debe contener por lo menos un carácter no alfanumérico Ej. Un punto, coma, etc; para mí ejemplo los usuarios son: Andrea y la contraseña para los dos es almonacid.0) ahora estos usuarios quedarán en la nueva base de datos que nos crea el servicio Membresía alojada en la carpeta aplication data(App_Data) de nuestro proyecto, siguiente, en reglas de acceso no haremos nada, más adelante generaremos reglas de acceso en préstamos para los usuarios anónimos, siguiente, finalizar, observen que aparece el número 2 en usuarios existentes y desde aquí podemos crear más usuarios y demás posibilidades, cerramos la ventana y volvemos al diseño, observemos en el Web Config que se ha modificado el fichero(ya no es modo de autenticación Windows sino Forms), observemos además que en la carpeta App_Data aparecerá otra base de datos llamada ASPNETDB.MDF(si no aparece de una actualicemos la aplicación), con click derecho la abrimos y observemso todas las tablas que nos ha creado el asistente de los

Page 11: compumakia.files.wordpress.com … · Web viewUn punto, coma, etc; para mí ejemplo los usuarios son: Andrea y la contraseña para los dos es almonacid.0) ahora estos usuarios quedarán

servicios Membership y demás que serán utilizados por el nivel de aplicación de ASPNET 2.0, (Nota: no olvidar que estamos utilizando como proveedor de almacenamiento de información de usuario ASPNET SQL PROVIDER que ha generado esta base de datos y que puede utilizar además Access y otros modelos de datos, hasta Oracle; si se usa otro modelo de datos se necesitara escribirle el código del proveedor que enlazara la funcionalidad de Membership con el modelo base de datos del almacén personalizado); ahora vamos a modificar la plantilla master para añadir controles visuales relacionados con la seguridad, entonces agreguemos un control LoginStatus(grupo inicio de sesión) para no complicarnos y ubicar este control donde lo queremos que es sobre la tabla generada en diseño anteriormente, simplemente vamos a la interfaz de usuario, cortamos el código generado por el control y lo pegamos sobre la primer referencia que genero la tabla”<table”, quedaría más o menos así:

<asp:LoginStatus ID="LoginStatus1" runat="server" /> <table cellspacing="5" class="style1">

A este control LoginStatus se le pueden dar propiedades como: LoginImageUrl” una imagen ya diseñada y guardada en el fichero Imágenes para iniciar sesión”, en LogoutImageUrl” seleccionamos una imagen para finalizar sesión” , en LogoutAction”Redirect”, en LogoutPageUrl “Default”, ahora abajo del control LoginStatus agregamos un control Loginview, en su asistente de tareas selecionamos Vistas “LoggedInTemplate”, dentro de este control agregamos un control LoginName, debajo de este agregamos un control HyperLink(NavigateUrl ”PrestamosPendientes.aspx”, Text= “Mis prestamos pendientes”), (Nota: esto lo vería el usuario autenticado, es decir, vería el HyperLink Mis prestamos pendientes, mientras que el usuario anónimo no lo vería); entonces lo que tenemos es que cuando el usuario pulse el botón de iniciar la sesión automáticamente la infraestructura de Membership lo que hace es direccionar la navegación a una página Login que se añade así: agregamos un nuevo formulario Web basado también en la plantilla master llamado Login, vamos a diseño, añadimos un control Login” también de los nuevos presentados por ASPNET 2.0”, le damos a este control un formato profesional, además podemos convertirlo en plantilla para ver todos sus controles, así que convirtámoslo en plantilla por medio del asistente y para modificar los textos de los controles así: ingreso a las propiedades de Login System.Web.UI.WebControls.Login y en Font-Size “10pt”, selecciono el título que trae el control Login para que en el cuadro de propiedades me aparezca como encabezado <TD>, en Style le pongo en tamaño 12 pt, y traduzco los demás textos de los controles a mi gusto, observen en el diseño del control Login que a la derecha de cada aparecen asteriscos de color rojo, seleccionemos cada asterisco y en propiedades ErrorMessage”Introduzca Usuario”, y en ToolTip escribir lo mismo, hacer lo mismo con la clave.

Ahora vamos al formulario PrestamosPendientes, en el evento Load de la Pagina y adicionamos el siguiente código por lógica de aplicación:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load ObjectDataSource1.SelectParameters.Clear() ObjectDataSource1.SelectParameters.Add("Usuario", User.Identity.Name)

End Sub

Ahora corramos la aplicación para ver que esté funcionando bien.

Ahora queda pendiente generar seguridad para que solo los usuarios validados sean los únicos que puedan efectuar préstamos de libros así:

Añadamos una nueva carpeta llamada Seguridad , muevo con click sostenido el formulario Prestamos a esta carpeta, también debería mover el formulario PrestamosPendientes pero en este ejemplo no lo vamos a hacer, ahora vamos a la página Default para modificar el salto ya que no hemos tenido en cuenta la nueva carpeta Seguridad para saltar a la página Prestamos, vamos al asistente de tareas, editar plantilla, seleccionamos el control HyperLink, en su asistente Editar Enlace de Datos, en NavigateUrl modificamos el enlace agregando la carpeta Seguridad así: Eval("Id_libro", "~/Seguridad/Prestamos.aspx?Id_libro={0}"); programamos para que la pagina por defecto de arranque sea Default.aspx.

Ahora ya quedo preparado el sitio para aplicar seguridad en base a una red, entonces volvemos a ingresar al menú Sitio Web, configuración ASP.NET(para añadir una regla que evite que los usuarios anónimos ingresen al contenido de la carpeta

Page 12: compumakia.files.wordpress.com … · Web viewUn punto, coma, etc; para mí ejemplo los usuarios son: Andrea y la contraseña para los dos es almonacid.0) ahora estos usuarios quedarán

Seguridad), vamos a seguridad, crear reglas de acceso, seleccionamos la carpeta seguridad, chequeamos usuarios anónimos y en permiso denegar, aceptar y cerramos la ventana, ahora probemos la aplicación.

Ahora lo que nos hace falta es el código para poder alquilar una película, vamos a la página Prestamos que está dentro de la carpeta Seguridad y vamos al evento click del control Button Prestar en lógica de aplicación y codificamos sus acciones, también se debe crear un procedimiento así:

Partial Class PrestamosInherits System.Web.UI.Page

Public Sub PrestarLibro(ByVal Libro As String, ByVal Usuario As String)'1. COMPROBAR LAS COPIAS

Dim AdapterLibros As New LibrosDSTableAdapters.LibrosTableAdapter'Variables que contendran la configuracion hecha en las entidades de negocio del DataSet LibrosDS,es decir declaramos el adaptador de libros.

Dim Librito As New LibrosDS'variable que cargara el libro pasado mediante el Id_titulo de la entidad de negocio,es decir declaramos el DataSet de libros.

AdapterLibros.FillById_libro(Librito.Libros, Libro)'Ahora rellenamos el DataSet utilizando el Adaptador, es decir le pasamos FillById_libro que es el Id_titulo que lo tengo definido por parametros y el DataTable que es Libros mas elId_titulo que es Libro.

If Librito.Libros.Count = 0 Then'si el Id_titulo no existe entonces

Throw New ArgumentException("No exite el libro especificado")'Arrojo un axcepcion

End IfIf Librito.Libros(0).Copias = 0 Then'Compruebo si aun quedan copias de libros para alquilar

Throw New ArgumentException("No hay unidades disponibles")End If

'2. DECLARAMOS LAS COPIAS'Si el libro extiste y quedan copias entoncesLibrito.Libros(0).Copias -= 1 'decremento las copiasAdapterLibros.Update(Librito) 'Actualizo los cambios utilizando el adaptador '3. AGREGAR EL PRESTAMODim AdapterPrestamo As New PrestamosDSTableAdapters.PrestamosTableAdapterDim Prestamo As New PrestamosDSPrestamo.Prestamos.AddPrestamosRow(Usuario, Libro, DateTime.Now, False)'Añado una nueva fila dentro del DataSet que ahora mismo esta vacia que tenga el Usuario, el Id_Libro,la fecha actual, y si esta devuelta o no.

AdapterPrestamo.Update(Prestamo)'Paso al adapter de Prestamos le paso el DataSet para que incluya la nueva fila añadida en la BD.End Sub

Protected Sub BPrestamo_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles BPrestamo.ClickDim Libro As String = Request.QueryString("Id_libro")

Page 13: compumakia.files.wordpress.com … · Web viewUn punto, coma, etc; para mí ejemplo los usuarios son: Andrea y la contraseña para los dos es almonacid.0) ahora estos usuarios quedarán

'Voy a coger el Id_libro del QueryString y lo voy a meter en una variable de tipo string esta variable llamada Libro deriva del parametro puesto en el procedimieto anterior (PrestarLibro).

Dim Usuario As String = User.Identity.Name'Cojo el nombre del usuario de la entidad del usuario que se ha autenticado.esta variable llamada Usuario deriva del parametro puesto en el procedimieto anterior (PrestarLibro).

TryPrestarLibro(Libro, Usuario)'Ahora intento prestar el Libro llamando el metodo que tiene todo el proceso de libro

LMensaje.Text = "Libro Prestado"Catch ex As ExceptionLMensaje.Text = ex.MessageLMensaje.ForeColor = Drawing.Color.Red'El mensaje de la excepcion saldra en rojo

End Try

LMensaje.Visible = TrueBPrestamo.Visible = FalseDetailsView1.DataBind()End SubEnd Class

Nota Importante: El proceso generado anteriormente llamado PrestarLibro es peligroso ya que si se decrementaran las copias y una vez decrementado no se pudiera agregar el préstamo estaríamos perdiendo libros prestados donde no tenemos el registro de ese préstamo pues no sabríamos que persona presto el libro, no le podríamos reclamar, en conclusión se perderían libros.

Hacer que la operación de préstamo sea una operación transaccional y modificar el aspecto de toda la aplicación utilizando una nueva capacidad de ASP.NET 2.0.

El proceso préstamo es delicado ya que involucra 2 tablas y en concreto en el código anterior:

AdapterLibros.FillById_libro(Librito.Libros, Libro)'Ahora rellenamos el DataSet utilizando el Adaptador, es decir le pasamos FillById_libro que es el Id_libro que lo tengo definido por parametros y el DataTable que es Libros mas elId_libro que es Libro.

If Librito.Libros.Count = 0 Then'si el Id_titulo no existe entonces

Throw New ArgumentException("No exite el libro especificado")'Arrojo un axcepcion

End IfIf Librito.Libros(0).Copias = 0 Then'Compruebo si aun quedan copias de libros para alquilar

Throw New ArgumentException("No hay unidades disponibles")End If

'2. DECLARAMOS LAS COPIAS'Si el libro extiste y quedan copias entonces

Page 14: compumakia.files.wordpress.com … · Web viewUn punto, coma, etc; para mí ejemplo los usuarios son: Andrea y la contraseña para los dos es almonacid.0) ahora estos usuarios quedarán

Librito.Libros(0).Copias -= 1 'decremento las copiasAdapterLibros.Update(Librito) 'Actualizo los cambios utilizando el adaptador

Se reduce en una unidad las copias existentes de libros y si fallara la ejecución lo que estaría claro es que no podría agregar el préstamo:

Dim AdapterPrestamo As New PrestamosDSTableAdapters.PrestamosTableAdapterDim Prestamo As New PrestamosDSPrestamo.Prestamos.AddPrestamosRow(Usuario, Libro, DateTime.Now, False)'Añado una nueva fila dentro del DataSet que ahora mismo esta vacia que tenga el Usuario, el Id_Libro,la fecha actual, y si esta devuelta o no.

AdapterPrestamo.Update(Prestamo)'Paso al adapter de Prestamos le paso el DataSet para que incluya la nueva fila añadida en la BD.

Por lo tanto habríamos decrementado las copias pero no sabríamos que usuario fue el que presto el libro(como indique anteriormente se perdería un libro), para solucionar esto debemos hacer que el proceso sea transaccional, es decir que se ejecuten todos los pasos y que si en la ejecución algo va mal no se decrementan las copias y se hace así:

Primera opción: Usamos la transacción ADO.NET.

Segunda opción: Son los servicios empresariales de .NET para transacciones distribuidas

Tercera opción (nueva): Es utilizar una nueva biblioteca de clases del .net Framework 2.0 llamado System.Transactions(permite definir contextos o ámbitos transaccionales), este mecanismo usa el servicio de coordinación de transacciones distribuidas; para utilizar ese mecanismo añadamos una nueva referencia a nuestro proyecto para usar esa biblioteca así:

Click derecho sobre el proyecto, agregar referencia, escogemos en la lista de .Net “System.Transactions”, aceptar, nos ubicamos de nuevo en el código lógica de aplicación del formulario Prestamos y agregamos el siguiente código al procedimiento PrestarLibro (para mayor entendimiento lo nuevo agregado va en color rojo a continuación):

Imports System.TransactionsPartial Class PrestamosInherits System.Web.UI.Page

Public Sub PrestarLibro(ByVal Libro As String, ByVal Usuario As String)

Using tx As New TransactionScope

'1. COMPROBAR LAS COPIAS

Dim AdapterLibros As New LibrosDSTableAdapters.LibrosTableAdapter'Variables que contendran la configuracion hecha en las entidades de negocio del DataSet LibrosDS,es decir declaramos el adaptador de libros.

Dim Librito As New LibrosDS'variable que cargara el libro pasado mediante el Id_titulo de la entidad de negocio,es decir declaramos el DataSet de libros.

AdapterLibros.FillById_titulo(Librito.Libros, Libro)'Ahora rellenamos el DataSet utilizando el Adaptador, es decir le pasamos FillById_titulo que es el Id_titulo que lo tengo definido por parametros y el DataTable que es Libros mas elId_titulo que es Libro.

If Librito.Libros.Count = 0 Then

Page 15: compumakia.files.wordpress.com … · Web viewUn punto, coma, etc; para mí ejemplo los usuarios son: Andrea y la contraseña para los dos es almonacid.0) ahora estos usuarios quedarán

'si el Id_titulo no existe entonces

Throw New ArgumentException("No exite el libro especificado")'Arrojo un axcepcion

End IfIf Librito.Libros(0).Copias = 0 Then'Compruebo si aun quedan copias de libros para alquilar

Throw New ArgumentException("No hay unidades disponibles")End If

'2. DECLARAMOS LAS COPIAS'Si el libro extiste y quedan copias entoncesLibrito.Libros(0).Copias -= 1 'decremento las copiasAdapterLibros.Update(Librito) 'Actualizo los cambios utilizando el adaptador '3. AGREGAR EL PRESTAMODim AdapterPrestamo As New PrestamosDSTableAdapters.PrestamosTableAdapterDim Prestamo As New PrestamosDSPrestamo.Prestamos.AddPrestamosRow(Usuario, Libro, DateTime.Now, False)'Añado una nueva fila dentro del DataSet que ahora mismo esta vacia que tenga el Usuario, el Id_Libro,la fecha actual, y si esta devuelta o no.

AdapterPrestamo.Update(Prestamo)'Paso al adapter de Prestamos le paso el DataSet para que incluya la nueva fila añadida en la BD.

tx.Complete()'Define una transacción y que todas las operaciones se realicen dentro del contexto transaccional sin realizarse en firme, si se produce algun fallo se liberan los recurso de ese contexto transaccional y no pasa nada, se arroja la excepcion oportuna, y si no sucede nada todo lo que hay en ese contexto transaccional se sealiza en firme cuando se llama al metodo complete de la transaccion.

End UsingEnd Sub

Ahora podemos probar la aplicación pero hay un detalle y es que debemos arrancar desde nuestro PC el servicio del DTC “Coordinador de transacciones distruibuidas” así:

Click derecho en Equipo, Administrar, Servicios y Aplicaciones, Servicios, seleccionamos Coordinador de Transacciones (verificamos si su estado esta iniciado o no, de no estarlo con doble click ingresamos y le decimos en estado del servicio iniciar).

Ahora si podemos probar la página, al prestar un libro que en copias ya esté en 0, me debe enviar el mensaje en color rojo que diga “no hay unidades disponibles”, gracias al ámbito transaccional no se generan complicaciones.

Ahora si vamos a cambiar el aspecto del sitio web, para ello voy a utilizar lo que se llama temas y pieles para cambiar el aspecto sin cambiar las paginas, y lo hago así:

Click derecho sobre el proyecto, Agregar Carpeta ASP.NET, Tema(cambio el nombre tema1 por tema), click derecho sobre este tema, adicionar nuevo elemento, escogemos Hoja de Estilos (le doy el nombre de Estilos), agregar, en el cuerpo digito:

body {background: Black

Page 16: compumakia.files.wordpress.com … · Web viewUn punto, coma, etc; para mí ejemplo los usuarios son: Andrea y la contraseña para los dos es almonacid.0) ahora estos usuarios quedarán

}

Voy de nuevo a Tema y añado un archivo de mascara dándole el nombre que trae por defecto y añado el siguiente código para cambiar las filas de los controles GridView del tipo de letra que tenía por Franklin Gothic médium:

<asp:GridView runat="Server"><RowStyle Font-Names="Franklin Gothic Medium" Font-Size="10pt" /></asp:GridView>

Si corremos la aplicación no nos arrojara ningún cambio ya que no hemos aplicado el tema, para ello debemos tener claro si queremos hacerlo a todo el sitio “WebConfig” (en el WebConfig después de las líneas <system.web> <!--, en interfaz de usuario agrego lo siguiente: <pages theme="Tema"/>), o a nivel de página (Ejemplo: vamos al diseño de Default, en propiedades”DOCUMENT”, buscamos Theme=Tema )

“LA INTELIGENCIA CONSISTE NO SOLO EN EL CONOCIMIENTO SINO TAMBIEN EN LA DESTREZA DE APLICAR LOS CONOCIMIENTOS EN LA PRACTICA”. Aristóteles

NOTA: Este material es solo un introductorio, el estudiante debe fortalecer estos conceptos a medida que se van viendo las clase y anexarlos al portafolio.

FIRMA DEL ESTUDIANTE FIRMA Y CEDULA DEL ACUDIENTE

FIRMA DEL INSTRUCTOR