Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Guía Práctica para Elaborar Una Aplicación Web en Capas PDF
Guía Práctica para Elaborar Una Aplicación Web en Capas PDF
Módulo II
Presentación........................................................................................................................................ 5
Introducción ........................................................................................................................................ 6
Objetivos ............................................................................................................................................. 7
Objetivo General ............................................................................................................................. 7
Objetivos Específicos ....................................................................................................................... 7
1. JavaScript..................................................................................................................................... 7
Añadir JavaScript a una Página ....................................................................................................... 7
Sintaxis Básica ................................................................................................................................. 8
Operadores.................................................................................................................................. 9
Operadores Básicos ........................................................................................... 9
Operaciones con Números y Cadenas de Caracteres .................................... 10
Operadores Lógicos......................................................................................... 10
Código Condicional........................................................................................................................ 11
Control de Flujo ......................................................................................................................... 11
Bucles ............................................................................................................................................ 12
Bucle For.................................................................................................................................... 12
Bucle For – In ............................................................................................................................. 12
Bucle While................................................................................................................................ 12
Bucke Do-While ......................................................................................................................... 13
Break y Continue ....................................................................................................................... 13
Break ............................................................................................................... 13
Continue ........................................................................................................... 13
Arreglos (Arrays) ........................................................................................................................... 14
Objetos .......................................................................................................................................... 15
Objetos Simples ............................................................................................... 15
Objetos Literales........................................................................................................................ 15
Funciones como constructores ................................................................................................. 15
Funciones ...................................................................................................................................... 16
Declaración ................................................................................................................................ 17
Declaración de una función nombrada ..................................................................................... 17
Utilización de las funciones ....................................................................................................... 17
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 2 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Función que no devuelve valor ....................................................................... 17
Función que devuelve un valor ....................................................................... 18
Funciones Anónimas Autoejecutables ...................................................................................... 18
La palabra clave this ...................................................................................................................... 18
Function.call .............................................................................................................................. 19
Function.bind ............................................................................................................................ 19
2. jQuery ........................................................................................................................................ 19
Uso ................................................................................................................................................ 20
$(document).ready() ..................................................................................................................... 22
$(function().................................................................................................................................... 22
Selección de Elementos................................................................................................................. 23
Selector por ID (#) ..................................................................................................................... 23
Selector por clase (.) .................................................................................................................. 23
Selector por tipo de elemento .................................................................................................. 23
Navegación por nodos............................................................................................................... 23
Navegando del hijo al padre (parent) ....................................................................................... 24
Buscando el primer predecesor (closest) .................................................................................. 24
Selectores utilizados para encontrar un elemento ................................................................... 25
.next(), .nextAll(), .prev(), .prevAll()............................................................... 25
Trabajar con Selecciones ............................................................................................................... 27
Encadenamiento ....................................................................................................................... 27
Obtenedores (Getters) & Establecedores (Setters) .................................................................. 28
Eventos y Modificadores ............................................................................................................... 28
Click ........................................................................................................................................... 29
Change ....................................................................................................................................... 29
Mouseover, mouseenter, hover ............................................................................................... 30
css, attr, val, text, html .............................................................................................................. 30
AJAX ............................................................................................................................................... 32
¿Qué es AJAX? ........................................................................................................................... 32
¿Por qué usar JSON? ................................................................................................................. 32
$.get, $.post, $.ajax ................................................................................................................... 33
3. Bootstrap ................................................................................................................................... 34
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 3 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Distribución Básica ........................................................................................................................ 35
Plantilla Sencilla............................................................................................................................. 35
Diseñando con rejilla ..................................................................................................................... 36
Preparando la página ................................................................................................................ 36
Tipos de rejillas.............................................................................................................................. 37
Características de cada rejilla .................................................................................................... 37
Ejemplo básico de rejilla con Bootstrap .................................................................................... 38
Tipografía básicas .......................................................................................................................... 39
Encabezados (h) ........................................................................................................................ 39
Clases CSS .................................................................................................................................. 40
Clases CSS para alinear texto......................................................................... 40
Tablas ............................................................................................................................................ 41
Tablas Responsive ..................................................................................................................... 41
Imágenes ....................................................................................................................................... 42
Formularios ................................................................................................................................... 43
Formulario Básico...................................................................................................................... 43
Campos de Formularios ............................................................................................................ 44
Inputs ............................................................................................................... 44
Botones ..................................................................................................................................... 44
4. DLL DEBS Acceso a Datos .......................................................................................................... 45
Contenido ...................................................................................................................................... 46
Ejemplo.......................................................................................................................................... 46
5. Programación en Capas............................................................................................................. 47
Capa Entidades .............................................................................................................................. 53
Atributos.................................................................................................................................... 57
Constructor................................................................................................................................ 57
Propiedades............................................................................................................................... 57
Capa Datos .................................................................................................................................... 59
CAD ............................................................................................................................................ 59
D_Costumer............................................................................................................................... 61
GetAll() – Devolviendo todos los registros..................................................... 61
GetOne() – Devolviendo un único registro ...................................................... 62
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 4 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Save() – Guardar Registro (Insert/Update) ..................................................... 63
Del() – Borrar Registro.................................................................................... 65
Capa Negocio................................................................................................................................. 66
Capa Presentación......................................................................................................................... 68
Master Page .............................................................................................................................. 68
Web Forms ................................................................................................................................ 71
GetAll() – Devolver todos los registros en un GridView ............................................................ 74
GridView Responsive................................................................................................................. 77
Ventana Modal Bootstrap ......................................................................................................... 81
GetOne() – Llamar a un único registro ...................................................................................... 86
Lado del Servidor ............................................................................................ 87
Lado del Cliente............................................................................................... 88
Save() – Grabar Datos de Cliente (Insertar/Actualizar) ............................................................. 89
Del() – Eliminar Registros .......................................................................................................... 91
6. Conclusión ................................................................................................................................. 93
7. Bibliografía ................................................................................................................................ 93
Presentación
Este documento está elaborado con el objetivo de presentar de manera práctica los
pasos para elaborar una aplicación web, basada en programación en capas. Para
esto último me basaré en una dll que realiza el procesamiento con la base de datos,
la cual es de libre distribución y la he nombrado DEBSAccesoDatos.dll (Al final link
para su descarga).
Todos los enlaces provistos en este documento están acortados por medio del
servicio bit.ly o goo.gl, para poder mostrar texto corto y de fácil copiado.
Gracias por tomarte el tiempo de leer este documento, espero que te sea de utilidad
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 5 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Introducción
La programación por capas es una arquitectura cliente-servidor en el que el objetivo
primordial es la separación de la lógica de negocios de la lógica de diseño; un ejemplo
básico de esto consiste en separar la capa de datos de la capa de presentación al
usuario.
En el caso específico que nos atañe, haremos una aplicación a partir de la base de
datos de ejemplo de Microsoft® llamada (Adventure Works en su versión lite) de
libre distribución, la cual puedes descargar desde el sitio oficial
(http://bit.ly/1cNJOwx).
Como un recurso adicional, recomiendo mucho ver dos cursos que hice y están
publicados en mi canal de YouTube (@debsdaniel03), los links de la lista de
reproducción son:
1. Curso programación en capas, para una aplicación Desktop:
http://goo.gl/Qq4h9q.
2. Curso programación en capas, para una aplicación Web, en este curso se
reutilizan las capas del proyecto anterior: http://goo.gl/dzEr6i
Una vez hecho lo anterior, te será mucho más fácil entender lo que veremos a
continuación
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 6 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Para descargar la librería DEBSAccesoSQL.dll, ir a este enlace
http://bit.ly/dlldebsacceso luego de descargar el archivo, dentro viene
un proyecto pequeño de ejemplo e indicaciones de cómo utilizar la librería.
Objetivos
Objetivo General
Transmitir el conocimiento necesario a los alumnos para la elaboración de
una aplicación web en capas, utilizando como herramientas Visual Studio
2012, jQuery, JavaScript, Bootstrap y la librería DEBSAccesoDatos.
Objetivos Específicos
Enseñar elementos básicos de JavaScript y jQuery, como lenguajes del lado
del cliente, para una aplicación web.
Introducir conceptos básicos para manejo de elementos Responsive mediante
Bootstrap.
Mostrar los métodos contenidos en la librería DEBS Acceso Datos.
Dar a conocer conceptos de programación en capas, por medio de un ejemplo
práctico.
1. JavaScript
JavaScript es un lenguaje de programación que se utiliza principalmente para crear
páginas web dinámicas.
Una página web dinámica es aquella que incorpora efectos como texto que aparece
y desaparece, animaciones, acciones que se activan al pulsar botones y ventanas
con mensajes de aviso al usuario.
Existen dos formas de insertar código JavaScript dentro de una página: escribiendo
código en la misma (en inglés inline) o a través de un archivo externo utilizando la
etiqueta script. El orden en el cual se incluye el código es importante: un código que
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 7 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
depende de otro debe ser incluido después del que referencia (Ejemplo: Si la función
B depende de A, el orden debe ser A,B y no B,A).
Para mejorar el rendimiento de la página, el código JavaScript debe ser incluido al
final del HTML.
Sintaxis Básica
Las variables en los lenguajes de programación siguen una lógica similar a las
variables utilizadas en otros ámbitos como las matemáticas. Una variable es un
elemento que se emplea para almacenar y hacer referencia a otro valor. Gracias a
las variables es posible crear "programas genéricos", es decir, programas que
funcionan siempre igual independientemente de los valores concretos utilizados.
De la misma forma que si en Matemáticas no existieran las variables no se podrían
definir las ecuaciones y fórmulas, en programación no se podrían hacer programas
realmente útiles sin las variables.
La palabra reservada var solamente se debe indicar al definir por primera vez la
variable, lo que se denomina declarar una variable. Cuando se utilizan las variables
en el resto de instrucciones del script, solamente es necesario indicar su nombre.
El nombre de una variable también se conoce como identificador y debe cumplir las
siguientes normas:
Sólo puede estar formado por letras, números y los símbolos $ (dólar)
y _ (guión bajo).
El primer carácter no puede ser un número.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 8 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Por tanto, las siguientes variables tienen nombres correctos:
La tabulación mejora la lectura del código, pero no posee ningún significado especial
Operadores
Los operadores permiten manipular el valor de las variables, realizar operaciones
matemáticas con sus valores y comparar diferentes variables. De esta forma, los
operadores permiten a los programas realizar cálculos complejos y tomar decisiones
lógicas en función de comparaciones y otros tipos de condiciones.
Operadores Básicos
Los operadores básicos permiten manipular valores
Concatenación
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 9 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Multiplicación y división
Suma vs Concatenación
Forzar a una cadena de caracteres actuar como un número, tenemos varias opciones,
una es utilizar el constructor Number, que cuando es llamado como función obliga
al argumento a comportarse como un número. La otra opción es utilizar el operador
de suma unitaria (+), entregando el mismo resultado:
Operadores Lógicos
Operadores Lógicos AND y OR
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 10 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
primer operando si éste es falso; caso contrario devuelve el segundo operando.
Cuando ambos valores son verdaderos devuelve verdadero (true), sino devuelve
falso.
El uso de estos operadores puede llegar a resultar confuso para los que inician con
Javascript, debido a que la lógica no es igual a otros lenguajes de programación,
pero una vez dominado es muy útil.
Operadores de comparación
Código Condicional
A veces se desea ejecutar un bloque de código bajo ciertas condiciones. Las
estructuras de control de flujo — a través de la utilización de las declaraciones if y
else permiten hacerlo
Control de Flujo
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 11 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Bucles
Permiten ejecutar un bloque de código un determinado número de veces
Bucle For
Bucle For – In
Bucle While
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 12 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Bucke Do-While
Break y Continue
Break
Usualmente, el fin de la ejecución de un bucle resultará cuando la condición no siga
evaluando un valor verdadero, sin embargo también es posible parar un bucle
utilizando la declaración break dentro del cuerpo.
Continue
Termina la ejecución de las sentencias de la iteración actual del bucle actual o la
etiqueta y continua la ejecución del bucle con la próxima iteración.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 13 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Arreglos (Arrays)
Los arreglos (en inglés arrays) son listas de valores con índice-cero (en inglés zero-
index), es decir, que el primer elemento del arreglo está en el índice 0. Éstos son
una forma práctica de almacenar un conjunto de datos relacionados (como cadenas
de caracteres), aunque en realidad, un arreglo puede incluir múltiples tipos de datos,
incluso otros arreglos.
Para acceder a cada elemento, se hará por medio de su índice, de esta forma:
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 14 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Objetos
En Javascript hay diversas formas de crear objetos, todas son válidas y sirven para
cumplir diversos propósitos. Javascript está basado en prototipos y no en clases
(como Java o C#).
Objetos Simples
La forma más simple de crear un objeto es instanciar un objeto de tipo Object y
agregarle las propiedades y métodos dinámicamente:
Objetos Literales
Nota Aclaratoria: usar objetos literales no significa usar JSON, JSON es una notación
basada ó influenciada por la sintaxis de los objetos literales de Javascript. Un object
literal es una manera de definir un objeto conforme a la sintaxis definida de
Javascript. JSON en cambio es un formato de intercambio de información que se
codifica con un formato similar al definido para los objetos literales. (Gracias a
Alberto Ávila por esta aclaración en sus comentarios)
En un objeto literal las propiedades son creadas como lista de pares key/value.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 15 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Ahora podemos pasarle valores al constructor para que establezca nombre y edad con
el valor que nos plazca, y si no están definidos que tome un valor por default usando
el operador || .
Funciones
Cuando se desarrolla una aplicación compleja, es muy habitual utilizar una y otra vez
las mismas instrucciones. Un script para una tienda de comercio electrónico por
ejemplo, tiene que calcular el precio total de los productos varias veces, para añadir
los impuestos y los gastos de envío.
Cuando una serie de instrucciones se repiten una y otra vez, se complica demasiado
el código fuente de la aplicación, ya que:
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 16 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Si se quiere modificar alguna de las instrucciones repetidas, se deben hacer
tantas modificaciones como veces se haya escrito esa instrucción, lo que se
convierte en un trabajo muy pesado y muy propenso a cometer errores.
Las funciones son la solución a todos estos problemas, tanto en JavaScript como en
el resto de lenguajes de programación. Una función es un conjunto de instrucciones
que se agrupan para realizar una tarea concreta y que se pueden reutilizar
fácilmente.
Declaración
En esta ocasión veremos dos tipos de funciones, las que no devuelven valor y las
que sí lo hacen. En POO, esto se llamaría procedimientos y métodos,
respectivamente.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 17 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Función que devuelve un valor
Este tipo de estructura pueden codificarse de varias formas, pero la más popular es
la siguiente:
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 18 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
2. Si la función a invocar es creada utilizando Function.bind, this será el primer
argumento que es pasado a la función en el momento en que se la crea;
3. Si la función es invocada como un método de un objeto, this referenciará a
dicho objeto;
4. De lo contrario, si la función es invocada como una función independiente, no
unida a algún objeto, this referenciará al objeto global.
Function.call
Function.bind
2. jQuery
jQuery es una biblioteca de JavaScript, creada inicialmente por John Resig, que
permite simplificar la manera de interactuar con los documentos HTML, manipular
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 19 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
el árbol DOM, manejar eventos, desarrollar animaciones y agregar interacción con
la técnica AJAX a páginas web. Fue presentada el 14 de enero de 2006 en el BarCamp
NYC. jQuery es la biblioteca de JavaScript más utilizada.1
Uso
Antes de iniciar, se recomienda tener la última versión estable de jQuery, para el día
de la edición de este documento, la última versión estable era la 2.1.3.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 20 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Al escoger la opción Download jQuery, te llevará a otra ventana donde escogerás
entre la versión 1.x o la 2.x, básicamente la diferencia es el ya casi extinto Internet
Explorer, a cómo puedes notar en la siguiente imagen que resalté el comentario.
Otra forma de trabajar con jQuery sin necesidad de descargarlo es utilizando CDN
(Content Delivery Network o Red de Entrega de Contenido), lo cual facilita el no
descargar el archivo y sólo lo utilizaremos, jQuery recomienda esta forma
Pero te recomiendo utilizar otro CDN, más abajo en la misma página de descarga te
indica varios, entre los más comunes está el CDN de google.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 21 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Pero nosotros descargamos la librería, por tanto, el uso que le daremos será cargarlo
desde nuestro servidor, así que la carga será igual que las anteriores, pero con una
dirección relativa desde el documento que haga la invocación hasta el lugar donde
esté en nuestro servidor la librería jQuery, para nuestro caso, la librería está ubicada
en el mismo directorio del archivo que lo invoca, por tanto ponemos así:
$(document).ready()
No es posible interactuar de forma segura con el contenido de una página hasta que
el documento no se encuentre preparado para su manipulación. jQuery permite
detectar dicho estado a través de la declaración $(document).ready() de forma tal que
el bloque se ejecutará sólo una vez que la página esté disponible.
$(function()
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 22 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Selección de Elementos
El concepto más básico de jQuery es el de “seleccionar algunos elementos y realizar
acciones con ellos”. La biblioteca soporta gran parte de los selectores CSS3 y varios
más no estandarizados. En http://api.jquery.com/category/selectors/ se puede
encontrar una completa referencia sobre los selectores de la biblioteca.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 23 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Otra forma podría ser haciendo una referencia, pasaríamos al padre como segundo
valor, y le indicamos que busque dentro de la referencia
Ahora quiero acceder a la segunda imagen únicamente, usamos el selector eq, éste
verifica cuantos hermanos tiene dentro de un padre, es decir compara cuantas
imágenes más existen dentro de su posición actual.
Como son 4 imágenes, la primera imagen es el índice 0, y la ultima el índice 3, si
quiero acceder a la segunda imagen hago esto
Supongamos que se hizo click en un hipervínculo que está dentro de un div, quiero
que ese div se ponga de color amarillo para saber que esta seleccionado, para hace
usamos parent, lo que hace es nuestra referencia es el hipervínculo, y con parent le
decimos que busque a su contenedor de esto, con eso llegamos al div, se pueden
hacer múltiples parents hasta llegar a las etiquetas BODY
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 24 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Selectores utilizados para encontrar un elemento
Estos selectores encuentran otros elementos que guardan relación con los elementos
previamente seleccionados (como los que encuentran descendientes, antecesores o
hermanos de una selección anterior, por ejemplo)
Estos métodos son bastante sencillos. Por ejemplo, si quisiéramos seleccionar sólo
el elemento único siguiente hermano de cada elemento previamente seleccionado,
utilizaríamos .next().
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 25 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Si quisiéramos seleccionar todos los hermanos que siguen al elemento seleccionado
utilizaríamos .nextAll(). Por ejemplo, localizar todos los divs que siguen al primero
y aplicarles una clase que llamaremos “rojo” y que implica un borde rojo alrededor
del DIV (fuente: web oficial de jQuery):
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 26 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
El resultado es:
Encadenamiento
Si en una selección se realiza una llamada a un método, y éste devuelve un objeto
jQuery, es posible seguir un “encadenado” de métodos en el objeto.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 27 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Si desea volver a la selección original en el medio del encadenado, jQuery ofrece el
método $.fn.end para poder hacerlo.
Eventos y Modificadores
jQuery provee métodos para asociar controladores de eventos (en inglés event
handlers) a selectores. Cuando un evento ocurre, la función provista es ejecutada.
Dentro de la función, la palabra clave this hace referencia al elemento en que el
evento ocurre.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 28 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
La función del controlador de eventos puede recibir un objeto. Este objeto puede ser
utilizado para determinar la naturaleza del evento o, por ejemplo, prevenir el
comportamiento predeterminado de éste. Para más detalles sobre el objeto del
evento, visite http://api.jquery.com/category/events/event-object/.
Click
Se ejecuta cuando se hace click sobre algún elemento.
Ejemplo:
Change
Sucede cuando un elemento select, input, textarea cambia de valor.
Ejemplo:
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 29 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Mouseover, mouseenter, hover
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 30 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
On
ON es utilizado cuando los elementos html han sido anidados después de que el
documento ha sido cargado.
Ejemplo: supongamos que el siguiente botón fue creado con código JavaScript,
después de cargar el documento, es decir hicieron un
.html('<button id="mi_boton2"></button>')
si asignáramos un evento sin on, no podríamos hacer nada, ya que no existe, pero
con on si
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 31 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
AJAX
El método XMLHttpRequest (XHR) permite a los navegadores comunicarse con el
servidor sin la necesidad de recargar la página. Este método, también conocido como
Ajax (Asynchronous JavaScript and XML), permite la creación de aplicaciones ricas
en interactividad.
Las peticiones Ajax son ejecutadas por el código JavaScript, el cual envía una
petición a una URL y cuando recibe una respuesta, una función de devolución puede
ser ejecutada la cual recibe como argumento la respuesta del servidor y realiza algo
con ella. Debido a que la respuesta es asíncrona, el resto del código de la aplicación
continua ejecutándose, por lo cual, es imperativo que una función de devolución sea
ejecutada para manejar la respuesta.
A través de varios métodos, jQuery provee soporte para Ajax, permitiendo abstraer
las diferencias que pueden existir entre navegadores. Los métodos en cuestión
son $.get(), $.getScript(), $.getJSON(), $.post() y$().load().
¿Qué es AJAX?
Es una técnica para aplicaciones web que permite realizar una consulta al servidor,
este puede ser síncrona (esperamos una respuesta) o asíncrona (no esperamos
respuesta), y existen diversas forma para manipular la información obtenida por ajax,
ya sea como texto plano, xml, o json la que más recomiendo es trabajar usando json.
Pueden tener más información consultando el enlace de Wikipedia
http://es.wikipedia.org/wiki/AJAX
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 32 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
$.get, $.post, $.ajax
$.get (url, parámetros, callback, tipo) realiza una petición XHR al servidor a
través de la URL, método GET
$.post (url, parámetros, callback, tipo) realiza una petición XHR por debajo del
servidor, método POST
$.ajax: Debes si quieres trabajar con post, get, que tipo de encabezado enviar,
recibir, en caso de que la petición se murió que hacer, etc.
Hay muchas cosas más sobre jQuery y JavaScript, pero con lo que hemos visto es
suficiente para que puedas iniciar a trabajar con jQuery utilizando ASP.NET.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 33 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
3. Bootstrap
En la actualidad muchos sitios web están elaborando su diseño en Bootstrap, ¿Qué
es Bootstrap? Pues en pocas palabras es el framework de Twitter que permite
crear interfaces web con CSS y Javascript que adaptan la interfaz dependiendo del
tamaño del dispositivo en el que se visualice de forma nativa, es decir,
automáticamente se adapta al tamaño de un ordenador o de una Tablet sin que el
usuario tenga que hacer nada, esto se denomina diseño adaptativo o Responsive
Design y está muy de moda.
Existen varias formas diferentes de empezar con Bootstrap, cada una orientada a un
tipo de público en función de su nivel técnico. Sigue leyendo para conocer cuál de
estas opciones se ajusta mejor a tus necesidades.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 34 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Distribución Básica
Plantilla Sencilla
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 35 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Diseñando con rejilla
Preparando la página
Antes de comenzar a diseñar el layout o estructura de contenidos de las páginas, es
necesario realizar algunos preparativos importantes.
Bootstrap utiliza algunos elementos HTML y algunas propiedades CSS que requieren
el uso deldoctype de HTML5. No olvides incluir este doctype en todas tus páginas con
el siguiente código:
Bootstrap 2 incluía algunas utilidades para hacer que las páginas se adaptaran a los
dispositivos móviles. Bootstrap 3 se ha creado desde cero pensando en los móviles.
Así que en vez de incluir algunos estilos opcionales para móviles, todo eso ya está
incluido en el propio Bootstrap. Por eso nos gusta decir que para Bootstrap 3, los
dispositivos móviles son lo más importante.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 36 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Para que las páginas se muestren correctamente y el zoom funcione bien en los
dispositivos móviles, es importante que añadas la siguiente etiqueta dentro de la
cabecera <head> de las páginas:
Tipos de rejillas
Bootstrap incluye una rejila o retícula fluída pensada para móviles y que cumple con
el diseño webresponsive. Esta retícula crece hasta 12 columnas a medida que crece
el tamaño de la pantalla del dispositivo. Bootstrap incluye clases CSS para utilizar la
rejilla directamente en tus diseños y también define mixins de LESS para que puedas
crear diseños más semánticos.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 37 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Ejemplo básico de rejilla con Bootstrap
El siguiente ejemplo muestra cómo crear una rejilla con las clases .col-md-*. En los
dispositivos móviles (extra pequeño o pequeño) esta rejilla se muestra verticalmente,
pero en un ordenador (medio o grande) se ve horizontalmente.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 38 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Que da como resultado:
Tipografía básicas
Los estilos relacionados con la tipografía y el texto de los contenidos son esenciales
en cualquier framework CSS. Por esa razón, Bootstrap 3 incluye decenas de estilos
para los principales elementos utilizados en los sitios y aplicaciones web.
Encabezados (h)
Bootstrap 3 define estilos por defecto para todos los niveles de titulares de las
páginas, desde <h1>hasta <h6>. Ejemplo:
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 39 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Clases CSS
Clases CSS para alinear texto
Bootstrap 3 define varias clases CSS para alinear de diferentes formas el contenido
de texto de los elementos.
Ejemplo:
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 40 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Hay más detalles, que los puedes ver en http://librosweb.es/libro/bootstrap_3
Tablas
Añade la clase .table a cualquier elemento <table> para aplicar los estilos básicos
de Bootstrap 3 para tablas. El resultado es una tabla con un padding muy sutil y con
líneas de separación solamente en las filas.
Puede parecer absurdo tener que añadir la clase .table para que se apliquen los
estilos a las tablas, pero ten en cuenta que el elemento <table> se utiliza para muchas
otras cosas que no son necesariamente tablas, como por ejemplo calendarios y
selectores de fechas.
Ejemplo:
Tablas Responsive
La solución que propone Bootstrap 3 para crear tablas responsive que se vean bien
en dispositivos pequeños consiste en añadir un scroll horizontal a las tablas que sean
demasiado anchas. Para ello, encierra cualquier tabla con la clase .table dentro de
un elemento con la clase .table-responsive. Cuando las tablas responsive se
muestran en dispositivos con una anchura superior a 768px, se ven igual que
cualquier otra tabla normal.
Ejemplo:
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 41 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Imágenes
Bootstrap 3 define varias clases CSS para decorar las imágenes de tus sitios web:
.img-rounded, añade unas pequeñas esquinas redondeadas en todos los lados
de la imagen aplicando el estilo border-radius: 6px.
.img-thumbnail, muestra la imagen con un relleno blanco y un borde fino
simulando el aspecto de las fotografías de las antiguas cámaras instantáneas.
Añade además una breve animación para hacer que la imagen aparezca al
cargar la página.
.img-circle, convierte la imagen en un círculo aplicando el estilo border-
radius: 50%
Ejemplo:
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 42 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Formularios
Los formularios son uno de los elementos más importantes de los sitios y
aplicaciones web. Por eso Bootstrap 3 permite diseñar formularios con aspectos muy
variados y define decenas de estilos para todos los campos de formulario.
Formulario Básico
Bootstrap 3 aplica por defecto algunos estilos a todos los componentes de los
formularios. Si además añades la clase .form-control a los
elementos <input>, <textarea> y <select>, su anchura se establece a width: 100%.
Para optimizar el espaciado, utiliza la clase .form-group para encerrar cada campo
de formulario con su <label>.
Ejemplo:
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 43 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Campos de Formularios
Bootstrap 3 define estilos adecuados para todos y cada uno de los campos de
formulario existentes.
Inputs
Los campos de tipo <input> son los más numerosos, ya que con HTML5 la lista se
ha ampliado a text, password, datetime, datetime-local, date, month, time, week,
number, email, url, search, tel, y color.
Botones
Crea diferentes tipos de botones con ayuda de cualquiera de las clases CSS definidas
por Bootstrap 3. Ejemplo:
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 44 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Hay más elementos para trabajar con Bootstrap, pero hemos visto lo más básico. Te
recuerdo visitar el sitio web oficial http://getbootstrap.com/
DEBS Acceso Datos es una librería freeware, de libre distribución elaborada por mi
persona (Daniel Bojorge) con el fin de hacer más sencillo el desarrollo de
aplicaciones en capa, tanto para Desktop como para Web.
Los cursos en videos (sugeridos al inicio de este documento), utilizan dicha librería.
Para una mejor comprensión, recomiendo y aconsejo entrar a YouTube y ver todo
este video, donde explico a mayor detalle el funcionamiento de esta librería.
http://goo.gl/vfhSPG
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 45 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Contenido
Ejemplo
En la siguiente sección (capítulo), abordaremos más de la librería, ya que iniciaremos
el proyecto de ejemplo, donde aplicaremos todos los métodos.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 46 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
5. Programación en Capas
La programación por capas es una arquitectura cliente-servidor en el que el objetivo
primordial es la separación de la lógica de negocios de la lógica de diseño; un ejemplo
básico de esto consiste en separar la capa de datos de la capa de presentación al
usuario.
Capa de Datos
Capa de Entidades
Capa de Negocio
Capa de Presentación
La aplicación que haremos, será del control de clientes, utilizando la base de datos
Adventure Works en su versión Lite. Para esto, debemos ver la estructura de la
tabla que vamos a procesar.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 47 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Para iniciar, debemos abrir un nuevo proyecto en Visual Studio y seguimos estos
pasos:
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 48 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Escoger plantilla Web
Aplicación web vacía de ASP.NET
Poner un nombre al proyecto
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 49 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Quedando de esta forma en el explorador de soluciones:
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 50 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Luego debemos agregar referencia a la librería DEBSAccesoDatos.dll, la cual la
podemos descargar desde el enlace dado al inicio del documento.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 51 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Esto lo haremos con la capa de datos y la de negocios.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 52 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Iniciamos ahora con el trabajo en la capa de entidades, creando cada una de las
entidades a utilizar.
Capa Entidades
Para entender mejor qué hace esta capa, debemos de verla como una capa intermedia
que comunica las demás capas, a como lo podemos ver en el siguiente gráfico.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 53 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Por tanto, tiene la importante tarea de comunicar entre las diferentes capas.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 54 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
El contenido de esta clase, es básicamente una “transcripción” de los campos de la
tabla (que representa la entidad) y su debido constructor, quedando de la siguiente
manera:
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 55 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Esta es la forma más básica de crear una entidad, pero si queremos hacerlo con
todos los requerimientos, debemos ver una opción más completa, la dividiremos en
3 partes:
Atributos
Constructor
Propiedades
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 56 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Atributos
Constructor
Propiedades
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 57 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 58 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Con esto ya tenemos la entidad para la tabla Customer de la base de datos, este
proceso se debe repetir para cada tabla a procesar y así se creará una entidad.
Capa Datos
El primer paso, será crear una clase CAD, la cual tendrá la conexión con la base de
datos.
CAD
Agregaremos una clase nueva a la que le pondremos por nombre CAD (Acrónimo de
Capa de Acceso a Datos)
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 59 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Una vez creada, agregar los espacios de nombres a como se indica en la figura
siguiente, ahí también podemos ver esta clase debe heredar de DEBSAccesoDatos y
cómo vamos a construir el constructor.
Algo muy importante que debemos tomar en cuenta es la propiedad cConex, la cual
contiene la cadena de conexión a la base de datos que se utilizará, para saber cuál
es la más indicada, podemos ir al siguiente enlace
https://www.connectionstrings.com/sql-server-2012/
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 60 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Luego debemos instanciar el objeto conexión a como se muestra en la figura anterior,
con esto ya tenemos cargada la librería, lista para usarse. De acá en adelante, todas
las nuevas clases que se crearán en la capa de datos, deben heredar de ésta clase
recién creada (CAD).
D_Costumer
En la capa de datos es donde crearemos todos los accesos de nuestra aplicación a
la base de datos, crearemos una clase para cada tabla (o proceso) a implementar, en
cada clase, como mínimo tendremos 4 métodos:
GetAll(): Devolver todos los registros, en un DataSet
GetOne(): Devolver un único registro como una instancia de la entidad
respectiva (en nuestro caso la entidad E_Customer)
Save(): Guarda los registros (insertar/actualizar).
Del(): Borrar un registro.
Esta clase, debe heredar de CAD, así como se deben importar los espacios de
nombres:
System.Data
System.Data.SQLClient
CapaEntidades
Imports System.Data
Imports System.Data.SqlClient
Imports CapaEntidades
Public Class D_Customer
Inherits CAD
End Class
Una vez que ya tenemos la vinculación necesaria, comenzamos con los métodos
Try
Dim cmd As SqlCommand = CrearComando("Customer_Get")
DS = GetDS(cmd, "Customer_Get")
Catch ex As Exception
Throw New Exception("Error Obteniendo todos los registros - " & ex.Message, ex)
End Try
Return DS
End Function
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 61 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
La funcionalidad es sencilla, se crea un comando al cual se le pasa el procedimiento
almacenado Customer_Get, luego se invoca al método GetDS, quien se encarga de
conectarse a la base de datos, ejecutar el procedimiento almacenado y devolver un
DataSet con el resultado.
El contenido del procedimiento almacenado es utilizado para devoler uno o todos los
registros:
Para efectos didácticos se envían todos los campos (SELECT *), ya en producción, se
recomienda enviar únicamente los campos a utilizar.
Try
cmd = CrearComando("Customer_Get")
cmd.Parameters.AddWithValue("@CustomerId", CustomerId)
AbrirConexion()
Dim consulta As SqlDataReader = Ejecuta_Consulta(cmd)
If consulta.Read() Then
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 62 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
If consulta.HasRows() Then
vRes.CustomerId = Convert.ToInt32(consulta("CustomerId"))
vRes.NameStyle = Convert.ToBoolean(consulta("NameStyle"))
vRes.Title = Convert.ToString(consulta("Title"))
vRes.FirstName = Convert.ToString(consulta("FirstName"))
vRes.MiddleName = Convert.ToString(consulta("MiddleName"))
vRes.LastName = Convert.ToString(consulta("LastName"))
vRes.Suffix = Convert.ToString(consulta("Suffix"))
vRes.CompanyName = Convert.ToString(consulta("CompanyName"))
vRes.SalesPerson = Convert.ToString(consulta("SalesPerson"))
vRes.EmailAddress = Convert.ToString(consulta("EmailAddress"))
vRes.Phone = Convert.ToString(consulta("Phone"))
vRes.PasswordHash = Convert.ToString(consulta("PasswordHash"))
vRes.PasswordSalt = Convert.ToString(consulta("PasswordSalt"))
vRes.ModifiedDate = Convert.ToDateTime(consulta("ModifiedDate"))
End If
End If
consulta.Close()
consulta = Nothing
Catch ex As Exception
Throw New Exception("Error Obteniendo un registro - " & ex.Message, ex)
Finally
cmd.Connection.Close()
cmd = Nothing
CerrarConexion()
End Try
Return vRes
End Function
cmd.Parameters.AddWithValue("@NameStyle", oCustomer.NameStyle)
cmd.Parameters.AddWithValue("@Title", oCustomer.Title)
cmd.Parameters.AddWithValue("@FirstName", oCustomer.FirstName)
cmd.Parameters.AddWithValue("@MiddleName", oCustomer.MiddleName)
cmd.Parameters.AddWithValue("@LastName", oCustomer.LastName)
cmd.Parameters.AddWithValue("@Suffix", oCustomer.Suffix)
cmd.Parameters.AddWithValue("@CompanyName", oCustomer.CompanyName)
cmd.Parameters.AddWithValue("@SalesPerson", oCustomer.SalesPerson)
cmd.Parameters.AddWithValue("@EmailAddress", oCustomer.EmailAddress)
cmd.Parameters.AddWithValue("@Phone", oCustomer.Phone)
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 63 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
cmd.Parameters.AddWithValue("@PasswordHash", oCustomer.PasswordHash)
cmd.Parameters.AddWithValue("@PasswordSalt", oCustomer.PasswordSalt)
AbrirConexion()
vReg = Ejecuta_Accion(cmd)
vReg = Convert.ToInt32(cmd.Parameters("@CustomerId").Value)
Catch ex As Exception
Throw New Exception("Error Grabando Cliente - " & ex.Message, ex)
Finally
cmd.Connection.Close()
cmd = Nothing
CerrarConexion()
End Try
Return vReg
End Function
Como podemos ver, recibe como parámetro un objeto de tipo E_Customer, que luego
es enviado como parámetro al procedimiento almacenado, cuyo contenido es el
siguiente:
IF @IdTmp is null
Set @Nuevo = 1;
END
BEGIN TRAN
BEGIN TRY
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 64 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
IF @Nuevo = 1 --Registro es nuevo
BEGIN
Insert into SalesLT.Customer
(NameStyle,Title,FirstName,MiddleName,LastName,Suffix,
CompanyName,SalesPerson,EmailAddress,Phone,
PasswordHash,PasswordSalt)
values
(@NameStyle,@Title,@FirstName,@MiddleName,@LastName,@Suffix,
@CompanyName,@SalesPerson,@EmailAddress,@Phone,
@PasswordHash,@PasswordSalt);
END
COMMIT
END TRY
BEGIN CATCH
ROLLBACK
END CATCH
END
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 65 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Dim vRes As Boolean = False
Dim cmd As SqlCommand = New SqlCommand()
Dim vCant As Integer = -1
Try
cmd = CrearComando("Customer_Del")
cmd.Parameters.AddWithValue("@CustomerId", CustomerId)
AbrirConexion()
vCant = Ejecuta_Accion(cmd)
If vCant > 0 Then
vRes = True
End If
Catch ex As Exception
Throw New Exception("Error Eliminando Cliente - " & ex.Message, ex)
Finally
cmd.Connection.Close()
cmd = Nothing
CerrarConexion()
End Try
Return vRes
End Function
Con esto terminamos la capa de datos, para el objeto Customer de la Base de Datos.
Lo siguiente en este punto es, de momento, iniciar la capa de negocios.
Capa Negocio
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 66 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Imports System.Data.SqlClient
Imports System.Data
Imports CapaEntidades
Imports CapaDatos
End Class
Imports System.Data.SqlClient
Imports System.Data
Imports CapaEntidades
Imports CapaDatos
En esta etapa del proyecto, ya tenemos las capas que realizan todo el proceso, para
las cuales son transparentes para el usuario, a continuación comenzaremos a trabajar
con la capa de presentación o UI (User Interface por sus siglas en inglés), en este
punto es donde se hace la diferencia entre una aplicación para escritorio (Desktop)
y una aplicación Web. Las capas que tenemos hasta este momento, pueden ser
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 67 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
utilizadas indistintamente para ambos tipos de proyectos, a como lo pueden ver en
el curso online que se dejó al inicio de este documento y también en la bibliografía.
Capa Presentación
Llegamos a la etapa del proyecto que será visible para el usuario y por tanto, es la
oportunidad de poner en práctica todo lo que vimos al inicio de este documento.
Como esto es un documento práctico, vamos directamente al proceso de creación.
Master Page
Por tanto, vamos a agregar un nuevo elemento en la capa de presentación, en nuestro
caso se llama AppWebVB, este elemento será un Master Page (Página Maestra), para
hacer una variante del curso de programación en capas Web.
Lo que hará que se agrega una master page llamada Pagina.Master al proyecto
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 68 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
A nivel de código, la Master Page se ve así:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<asp:ContentPlaceHolder ID="head" runat="server">
</asp:ContentPlaceHolder>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</div>
</form>
</body>
</html>
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 69 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Será en esta sección donde pondremos las referencias a las librerías que
utilizaremos, tales como jQuery, Bootstrap o cualquier otro pluggin de jQuery. Así
que antes de continuar, vamos a agregar algunos directorios a este proyecto con el
fin de ordenar la información que pondremos, para que quede de la siguiente forma:
De momento agregaremos la librería jQuery (la versión más actual) y Boostrap, luego
en la sección de encabezado (head) de la master page, agregaremos cada archivo.
Agregué también la carpeta fonts para ubicar ahí cualquier fuente, de momento puse
ahí las que vienen con el paquete Boostrap.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 70 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Guía práctica para desarrollar APP Web en Capas - Por Ing.
Daniel Bojorge</title>
<link rel="stylesheet" href="css/bootstrap.min.css" />
<link rel="stylesheet" href="css/bootstrap-theme.min.css" />
<script src="js/jquery.min.js"></script>
<asp:ContentPlaceHolder ID="head" runat="server">
</asp:ContentPlaceHolder>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</div>
</form>
<script src="js/bootstrap.min.js"></script>
</body>
</html>
Como pueden ver en el head se agrega los css y jQuery, al finalizar (antes del cierre
Body) ponemos la carga de la librería js de boostrap.
Web Forms
Ahora, para probar si todo bien, vamos a agregar un Formulario Web que usa Master
Page, al cual nombraremos Default.aspx, ya que no tendremos otra página, pero si
hubiesen más, recomiendo nombrarla diferente.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 71 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Al dar click en agregar, nos pide indicar cuál Master Page utilizar, por lo que
escogemos la única que tenemos y que nombramos Pagina.Master.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 72 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
<%@ Page Title="" Language="vb" AutoEventWireup="false"
MasterPageFile="~/Pagina.Master" CodeBehind="Default.aspx.vb"
Inherits="AppWebVB._Default" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1"
runat="server">
</asp:Content>
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 73 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Al compilar, el proyecto veremos algo como lo que muestro en la siguiente imagen:
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 74 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Con esto, ya podemos iniciar el método IniGrd(). Observemos que creé un objeto
llamado oCliente, el cual es una instancia de N_Customer.
Imports CapaEntidades
Imports CapaNegocios
DGCustomer.UseAccessibleHeader = True
DGCustomer.HeaderRow.TableSection = TableRowSection.TableHeader
Catch ex As Exception
Response.Write(ex.Message)
End Try
End Sub
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 75 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
End Class
Si ocurriese un error, será enviado (de momento) como una impresión en pantalla al
compilar, algo así:
En este caso específico, el error consiste en que no está iniciada ninguna instancia
del servidor, pero como podemos observar, el mensaje está justo a como se
estableció en la capa de datos.
Una vez resuelto el problema, esta sería la primera vista de nuestros datos.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 76 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Sólo hay un inconveniente, aunque se muestra el dato solicitado, la “tabla” resultado,
se escapa de la pantalla, por lo que necesitamos que sea Responsive, ésto es que se
muestre toda la información en la pantalla, sin necesidad de utilizar la barra de
desplazamiento horizontal.
GridView Responsive
Como vimos en la sección de jQuery, esta biblioteca es muy potente, por tanto la
utilizaremos para hacer nuestra tabla (GridView) responsive, para esto utilizaremos
un plugin llamado DataTable para darle mejor formato, también la opción Responsive,
por tanto debemos ir al sitio web https://www.datatables.net/ y bajaremos la versión
más reciente de este plugin, de los cuales tomaremos los archivos necesarios
(marcados en esta imagen)
Luego en la página maestra, debemos agregar los CSS en la parte head y los .js al
final, para que quede de la siguiente manera.
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Guía práctica para desarrollar APP Web en Capas - Por Ing.
Daniel Bojorge</title>
<link rel="stylesheet" href="css/bootstrap.min.css" />
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 77 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
<link rel="stylesheet" href="css/bootstrap-theme.min.css" />
<script src="js/jquery.min.js"></script>
<asp:ContentPlaceHolder ID="head" runat="server">
</asp:ContentPlaceHolder>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server">
</asp:ContentPlaceHolder>
</div>
</form>
<script src="js/jquery.dataTables.min.js"></script>
<script src="js/dataTables.responsive.min.js"></script>
<script src="js/bootstrap.min.js"></script>
</body>
</html>
Quedando pendiente la inicialización del plugin, lo cual lo haremos una vez que se
cargue la página y no en la mater page sino en Default.aspx que es donde está el
GridView, para esto, por medio de jQuery hacemos lo siguiente:
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 78 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
"sNext": "Siguiente",
"sPrevious": "Anterior"
},
"oAria": {
"sSortAscending": ": Activar para ordenar la columna de
manera ascendente",
"sSortDescending": ": Activar para ordenar la columna de
manera descendente"
}
},
responsive: true
});
});
</script>
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1"
runat="server">
<h1>Guía práctica para desarrollar APP Web en Capas - <small>Ing.
Daniel Bojorge</small> </h1>
<asp:GridView ID="DGCustomer" runat="server" cssclass="table table-striped
table-hover dt-responsive" ></asp:GridView>
</asp:Content>
Pero para que funcione, debo cambiar el nombre del archivo jQuery, ya que yo puse
jquery-2.1.3.min.js, pero hago referencia en el script a jquery.min.js, así que por
motivos prácticos, quitaré el número de versión del archivo y lo dejaré como
jquery.min.js, compilo nuevamente y vemos que ahora nos sale esto en el navegador:
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 79 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Y como podemos observar, ya tiene una mejor presentación. Recomiendo ver la
página del plugin DataTable para tener más conocimiento de su funcionamiento.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 80 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Ventana Modal Bootstrap
En esta etapa del proyecto, haré una pausa antes de pasar a consultar un registro y
modificar/eliminar, para hablar cómo debemos montar una venta Bootstrap, que es
la que utilizaremos para mostrar, eliminar y/o actualizar los datos de un cliente.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 81 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Ahora debemos agregar la ventana modal, les mostraré cómo queda ya la ventana
con todos los elementos (inputs), para esto, en la parte final (debajo del GridView)
agregaremos lo siguiente:
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 82 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
name="txtTitle" id="txtTitle" placeholder=""
runat="server" />
</div>
<div class="row">
<label for="txtFirstName" class="control-label col-
sm-2">First Name</label>
<input type="text" class="input-control frmModal
col-sm-4"
name="txtFirstName" id="txtFirstName"
placeholder="First Name" runat="server" />
<label for="txtMiddleName" class="control-label col-
sm-2">Middle Name</label>
<input type="text" class="input-control frmModal
col-sm-4"
name="txtMiddleName" id="txtMiddleName"
placeholder="Middle Name" runat="server" />
</div>
<div class="row">
<label for="txtLastName" class="control-label col-
sm-2">Last Name</label>
<input type="text" class="input-control frmModal
col-sm-4"
name="txtLastName" id="txtLastName"
placeholder="Last Name" runat="server" />
<label for="txtSuffix" class="control-label col-sm-
2">Suffix</label>
<input type="text" class="input-control frmModal
col-sm-4"
name="txtSuffix" id="txtSuffix"
placeholder="Suffix" runat="server" />
</div>
<div class="row">
<label for="txtCompany" class="control-label col-sm-
2">Company</label>
<input type="text" class="input-control frmModal
col-sm-4"
name="txtCompany" id="txtCompany"
placeholder="Company" runat="server" />
<label for="txtSalesPerson" class="control-label
col-sm-2">Sales Person</label>
<input type="text" class="input-control frmModal
col-sm-4"
name="txtSalesPerson" id="txtSalesPerson"
placeholder="Sales Person" runat="server" />
</div>
<div class="row">
<label for="txtEmailAddress" class="control-label
col-sm-2">Email Address</label>
<input type="text" class="input-control frmModal
col-sm-4"
name="txtEmailAddress" id="txtEmailAddress"
placeholder="txtEmailAddress" runat="server" />
<label for="txtPhone" class="control-label col-sm-
2">Phone</label>
<input type="text" class="input-control frmModal
col-sm-4"
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 83 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
name="txtPhone" id="txtPhone"
placeholder="Phone" runat="server" />
</div>
<div class="row">
<label for="txtPassHash" class="control-label col-
sm-2">Pass Hash</label>
<input type="text" class="input-control frmModal
col-sm-4"
name="txtPassHash" id="txtPassHash"
placeholder="Pass Hash" runat="server" />
<label for="txtPassSalt" class="control-label col-
sm-2">Pass Salt</label>
<input type="text" class="input-control frmModal
col-sm-4"
name="txtPassSalt" id="txtPassSalt"
placeholder="Pass Salt" runat="server" />
</div>
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-
dismiss="modal">Cancelar</button>
<asp:Button ID="btnGrabar" class="btn btn-primary "
runat="server" Text="Grabar" CssClass="btn btn-primary” />
<button type="button" class="btn btn-danger" id="btnBorrar">
<span class="fa fa-trash-o fa-lg"></span> Borrar</button>
</div>
</div>
<!-- /.modal-content -->
</div>
<!-- /.modal-dialog -->
<!-- /.modal -->
Con el botón que agregamos, ya él por sí sólo puede activar la ventana modal (ponerla
visible), ya que utiliza características de Bootstrap, por tanto al dar click sobre el
botón, se mostrará de la siguiente manera:
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 84 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Algo más que tenemos que hacer para mejorar nuestra ventana, es que cuando se
cierre, se limpien todos los controles de usuario (imputs), para esto debemos agregar
el siguiente código, en la parte inferior de la inicialización del DataTable.
$('#myModal').on('shown.bs.modal', function () {
lastfocus = $(this);
$(this).find('input:text:visible:first').focus();
})
/*Cerrando Modal*/
$('#myModal').on('hidden.bs.modal', function (e) {
setTimeout(function () {
$("form").submit();
}, 500);
});
Lo que hacemos con esto es que al mostrase se active el primer inputs, y luego al
cerrar, limpie todos los inputs, también un pequeño truco, que cuando se cierre,
vuelva a cargar la página, enviando el formulario. Ya con esto, casi estamos listos
para cargar un Cliente. ¿Qué nos hace falta? Un poco de validación, para esto, no
vamos a utilizar ningún plugin de jQuery, sino la validación básica de html5, para
esto, los inputs de tipo correo (email), por ejemplo, obliga a escribir una dirección
de correo válida, los de tipo number, exige que se escriba un número y así
sucesivamente. Para esto, bastaría con cambiar el type de los inputs de text a su
respectiva propiedad en html5, pero sucede que Visual Studio 2012, manda un error
ya que no reconoce esos tipos, pero esto se puede resolver fácilmente mediante
JavaScript o del lado del servidor.
Del lado del servidor, la solución sería en el evento load, cambiar el type de los
inputs que deseamos de la siguiente manera:
IniGrd()
End Sub
La otra opción es haciéndolo desde el lado del cliente con JavaScript o jQuery de la
siguiente manera:
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 85 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
$("#<%=txtEmailAddress.ClientID%>").attr("type", "email");
$("#<%=txtPhone.ClientID%>").attr("type", "phone");
$("#<%=txtCustomId.ClientID%>").attr("type", "number");
En esta sección utilizaremos la ventana modal anterior para mostrar los datos de un
cliente al digitar su ID en el input llamado CustomerId, para tal motivo haremos dos
cosas, una del lado del servidor y la otra del lado del cliente:
Lado del Servidor: Crear un método que reciba como parámetro el id del
cliente y ejecute el GetOne de la capa de negocio, éste método debe ser de
tipo Method, por lo que se debe agregar el espacio de nombre
System.Web.Services para que pueda ser procesado desde el lado del cliente.
Lado del Cliente: Utilizaremos el evento KeyPress del input llamado
txtCustomerId, donde invocaremos AJAX, al cual le pasaremos el Id del input
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 86 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
y debe devolver en un arreglo los datos del cliente, en este punto rellenamos
cada input con el valor devuelto.
Imports System.Web.Services
<WebMethod()> _
Public Shared Function getcustomer(vcusid As String) As List(Of String)
Dim lista As List(Of String) = New List(Of String)()
Try
If Not vcusid = String.Empty Then
Dim vCustId As Integer = Convert.ToInt32(vcusid)
lista.Add(Convert.ToString(oCustomer.CustomerId))
lista.Add(Convert.ToString(oCustomer.NameStyle))
lista.Add(Convert.ToString(oCustomer.Title))
lista.Add(Convert.ToString(oCustomer.FirstName))
lista.Add(Convert.ToString(oCustomer.MiddleName))
lista.Add(Convert.ToString(oCustomer.LastName))
lista.Add(Convert.ToString(oCustomer.Suffix))
lista.Add(Convert.ToString(oCustomer.CompanyName))
lista.Add(Convert.ToString(oCustomer.SalesPerson))
lista.Add(Convert.ToString(oCustomer.EmailAddress))
lista.Add(Convert.ToString(oCustomer.Phone))
lista.Add(Convert.ToString(oCustomer.PasswordHash))
lista.Add(Convert.ToString(oCustomer.PasswordSalt))
End If
Catch ex As Exception
lista.Add("ERROR")
lista.Add(ex.Message)
End Try
Return lista
End Function
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 87 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Si sucede algún error, lo que opté fue agregar como primer elemento de la lista la
palabra "ERROR" y en el segundo elemento el mensaje de error, para así poder mostrar
del lado del cliente un mensaje o notificación al usuario.
Getcustomer es Public Shared Function esto es necesario para poder “verlo” desde
el lado del cliente.
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 88 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
$(this).attr("disabled", "disabled");
}
$("#<%=txtCustomId.ClientID%>").val(vCId);
$("#<%=chkNameStyle.ClientID%>").val(vNS);
$("#<%=txtTitle.ClientID%>").val(vTit);
$("#<%=txtFirstName.ClientID%>").val(vFN);
$("#<%=txtMiddleName.ClientID%>").val(vMN);
$("#<%=txtLastName.ClientID%>").val(vLN);
$("#<%=txtSuffix.ClientID%>").val(vSf);
$("#<%=txtCompany.ClientID%>").val(vCo);
$("#<%=txtSalesPerson.ClientID%>").val(vSP);
$("#<%=txtEmailAddress.ClientID%>").val(vEm);
$("#<%=txtPhone.ClientID%>").val(vPh);
$("#<%=txtPassHash.ClientID%>").val(vPa1);
$("#<%=txtPassSalt.ClientID%>").val(vPs);
if (seguir) {
$("#<%=chkNameStyle.ClientID%>").focus();
}
},
error: function(xhr,textStatus,error){
alert("Esto falló " + error);
}
});
}
});
Agregué una método llamado mensaje, que lo utilizaremos para poder enviar un alert
al usuario desde el lado del servidor
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 89 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Dim jsAlert As String = String.Format("alert('{0}');", msg)
ClientScript.RegisterStartupScript(Me.GetType(), "Alerta", jsAlert, True)
End Sub
Debemos agregar un evento click del lado del servidor para el botón btnGrabar de
la siguiente manera:
oCliente_Ent.CustomerId = vCustId
oCliente_Ent.NameStyle = chkNameStyle.Checked
oCliente_Ent.Title = txtTitle.Value
oCliente_Ent.FirstName = txtFirstName.Value
oCliente_Ent.MiddleName = txtMiddleName.Value
oCliente_Ent.LastName = txtLastName.Value
oCliente_Ent.Suffix = txtSuffix.Value
oCliente_Ent.CompanyName = txtCompany.Value
oCliente_Ent.SalesPerson = txtSalesPerson.Value
oCliente_Ent.EmailAddress = txtEmailAddress.Value
oCliente_Ent.Phone = txtPhone.Value
oCliente_Ent.PasswordHash = txtPassHash.Value
oCliente_Ent.PasswordSalt = txtPassSalt.Value
Try
PudoRegistrar = oCliente.Save(oCliente_Ent)
Catch ex As Exception
PudoRegistrar = -1
mensaje(ex.Message)
End Try
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 90 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Del() – Eliminar Registros
Para terminar las operaciones CRUD (Crear, Leer, Actualizar, Borrar por sus siglas
en Inglés), nos hace falta el borrar un registro, el cual lo haremos llamando un
WebMethod del lado del cliente, pero bien se podría hacer del lado del servidor toda
la operación completa.
<WebMethod> _
Public Shared Function borrar(ByVal vcust As String) As String
Dim vReturn As String = "0"
Try
Dim oCliente As N_Customer = New N_Customer()
If oCliente.Del(vCustId) Then
vReturn = "OK"
Else
vReturn = "Error Eliminando Registro"
End If
Catch ex As Exception
vReturn = "Error Eliminando Registros - " + ex.Message
End Try
Return vReturn
End Function
Ahora, del lado del cliente, tendremos el evento Click del botón btnBorrar:
$.ajax({
type: "POST",
datatype: "json",
contentType: "application/json; charset=utf-8",
url: '<%=ResolveUrl("Default.aspx")%>/borrar',
data: Data,
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 91 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
success: function (response) {
var vResp = response.d;
if (vResp === "OK") {
alert("Registro eliminado satisfactoriamente");
$('#myModal').modal('hide'); //Cerrar Ventana Modal
}
else {
alert(vResp);
}
},
error: function (xhr, txtStatus, error) {
alert("Error del lado del cliente " + error);
}
});
});
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 92 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Como hemos podido ver, no es tan complicado realizar una aplicación web con Visual
Studio (Visual Basic), SQL Server, jQuery, Bootstrap y la librería DEBSAccesoDatos.
6. Conclusión
A lo largo de este documento has podido ir viendo cómo se puede armar una
aplicación web, espero que te sea de utilidad.
Sé que este documento no está completo, falta profundizar en varios aspectos, por
eso te dejo en la bibliografía la mayoría de las fuentes que tuve para escribir. Te
recomiendo mucho que repases mucho esos enlaces.
7. Bibliografía
Apuntes propios
Cursos online:
o http://goo.gl/Qq4h9q - Curso Programación en Capas para App
Desktop.
o http://goo.gl/dzEr6i - Curso Programación en Capas para App Web.
Libro:
o Fundamentos jQuery – Rebecca Murphey
o HTML5 and JavaScript Projects – Jeanine Meyer (2011)
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 93 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com
Web:
o http://librosweb.es/libro/javascript/
o http://www.w3schools.com/js
o https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia
o http://hardcoders.mx/
o http://librojquery.com/
o https://librosweb.es/libro/bootstrap_3/
o http://www.javascriptya.com.ar/
o http://www.codeproject.com/Articles/21115/Building-an-N-Tier-
Application-in-VB-NET-in-Step
o https://tydw.wordpress.com/2008/08/14/asp-net-como-crear-una-
aplicacion-de-3-capas-con-entidades-1ra-parte/
Desarrollo de una aplicación web en capas. Elaborado por Ing. Daniel Bojorge Sequeira 94 / 94
facebook.com/debsconsultores ● youtube.com/user/debsdaniel03 ● debsconsultores.blogspot.com