You are on page 1of 33

UNIVERSIDAD DON BOSCO

FACULTAD DE ESTUDIOS TECNOLGICOS


COORDINACION DE COMPUTACIN
GUIA DE LABORATORIO #11
Nombre de la Prctica: Aplicaciones en capas en ASP.NET
CICLO: 02/2015

Lugar de Ejecucin:

Centro de cmputo

Tiempo Estimado:

2 horas con 30 minutos

MATERIA:

Desarrollo de Aplicaciones con Software Propietario


I. OBJETIVOS

Que el estudiante:
1. Conozca los fundamentos tericos sobre la programacin en capas en ASP.NET
2. Segmente una aplicacin en capas y niveles dependiendo de la necesidad que se presente
3. Diferencie las funciones de cada una de las capas en una aplicacin

II. INTRODUCCIN TERICA


Aplicaciones en capas en ASP.NET
La programacin por capas es una arquitectura cliente-servidor en el que el objetivo primordial es la
separacin de la lgica de negocios de la lgica de diseo; un ejemplo bsico de esto consiste en separar la
capa de datos de la capa de presentacin al usuario.

La ventaja principal de este estilo es que el desarrollo se puede llevar a cabo en varios niveles y, en caso de
que sobrevenga algn cambio, solo se ataca al nivel requerido sin tener que revisar entre cdigo mezclado. Un
buen ejemplo de este mtodo de programacin sera el modelo de interconexin de sistemas abiertos.
Adems, permite distribuir el trabajo de creacin de una aplicacin por niveles; de este modo, cada grupo de
trabajo est totalmente abstrado del resto de niveles, de forma que basta con conocer la API que existe entre
niveles.

Desarrollo de aplicaciones con software propietario 1 / 33

Gua #11: Aplicaciones en capas en ASP.NET


En el diseo de sistemas informticos actual se suelen usar las arquitecturas multinivel o Programacin por
capas. En dichas arquitecturas a cada nivel se le confa una misin simple, lo que permite el diseo de
arquitecturas escalables (que pueden ampliarse con facilidad en caso de que las necesidades aumenten).
El ms utilizado actualmente es el diseo en tres niveles (o en tres capas)
Capas y niveles
Capa de presentacin: la que ve el usuario (tambin se la denomina "capa de usuario"), presenta el
sistema al usuario, le comunica la informacin y captura la informacin del usuario en un mnimo de
proceso (realiza un filtrado previo para comprobar que no hay errores de formato). Tambin es
conocida como interfaz grfica y debe tener la caracterstica de ser "amigable" (entendible y fcil de
usar) para el usuario. Esta capa se comunica nicamente con la capa de negocio.
Capa de negocio: es donde residen los programas que se ejecutan, se reciben las peticiones del usuario
y se envan las respuestas tras el proceso. Se denomina capa de negocio (e incluso de lgica del
negocio) porque es aqu donde se establecen todas las reglas que deben cumplirse. Esta capa se
comunica con la capa de presentacin, para recibir las solicitudes y presentar los resultados, y con la
capa de datos, para solicitar al gestor de base de datos almacenar o recuperar datos de l. Tambin se
consideran aqu los programas de aplicacin.
Capa de datos: es donde residen los datos y es la encargada de acceder a los mismos. Est formada
por uno o ms gestores de bases de datos que realizan todo el almacenamiento de datos, reciben
solicitudes de almacenamiento o recuperacin de informacin desde la capa de negocio.

Todas estas capas pueden residir en un nico ordenador, si bien lo ms usual es que haya una multitud de
ordenadores en donde reside la capa de presentacin (son los clientes de la arquitectura cliente/servidor). Las
capas de negocio y de datos pueden residir en el mismo ordenador, y si el crecimiento de las necesidades lo
aconseja se pueden separar en dos o ms equipos. As, si el tamao o complejidad de la base de datos
aumenta, se puede separar en varios ordenadores los cuales recibirn las peticiones del ordenador en que
resida la capa de negocio.
Si, por el contrario, fuese la complejidad en la capa de negocio lo que obligase a la separacin, esta capa de
negocio podra residir en uno o ms ordenadores que realizaran solicitudes a una nica base de datos. En
sistemas muy complejos se llega a tener una serie de ordenadores sobre los cuales corre la capa de negocio, y
otra serie de ordenadores sobre los cuales corre la base de datos.
En una arquitectura de tres niveles, los trminos "capas" y "niveles" no significan lo mismo ni son similares.
El trmino "capa" hace referencia a la forma como una solucin es segmentada desde el punto de vista lgico:
Presentacin (Conocida como capa Web en aplicaciones Web o como capa de usuario en Aplicaciones
Nativas)
Lgica de Negocio. (Conocida como capa Aplicativa)
Datos. (Conocida como capa de Base de Datos)

Desarrollo de aplicaciones con software propietario 2

Gua #11: Aplicaciones en capas en ASP.NET


En cambio, el trmino "nivel" corresponde a la forma en que las capas lgicas se encuentran distribuidas de
forma fsica. Por ejemplo:
Una solucin de tres capas (presentacin, lgica del negocio, datos) que residen en un solo ordenador
(Presentacin+lgica+datos). Se dice que la arquitectura de la solucin es de tres capas y un nivel.
Una solucin de tres capas (presentacin, lgica del negocio, datos) que residen en dos ordenadores
(presentacin+lgica por un lado; lgica+datos por el otro lado). Se dice que la arquitectura de la
solucin es de tres capas y dos niveles.

III. MATERIALES Y EQUIPO


Para la realizacin de la gua de prctica se requerir lo siguiente:
No.

Requerimiento

Cantidad

Gua de prctica #11: Aplicaciones en capas en ASP.NET

Computadora con Visual Studio 2012 instalado y una instancia de SQL


Server con Management Studio Express

Memoria USB o disco flexible

IV. PROCEDIMIENTO
Parte 1: Creacin de base de datos usando SQL Server 2012 para que funcione como fuente de datos
1. Proceda a descargar los recursos complementarios de esta prctica.
2. Proceda a iniciar la herramienta de Microsoft SQL Server Management Studio instalada en su
computadora y desde el Explorador de Objetos, proceda a crear la base de datos Aplicacion_Capas.
Luego ejecute el script a continuacin, que creara las tablas de la bdd a utilizar.
use Aplicacion_Capas
create table Usuarios(
usuario varchar(20) primary key,
password varchar (20) not null,
nombre varchar(50) not null,
apellido varchar(50) not null,
pais int not null,
sexo char(1),
correo varchar(50),

Desarrollo de aplicaciones con software propietario 3

Gua #11: Aplicaciones en capas en ASP.NET

telefono varchar(30)
)
GO

create table Posts(


idpost int identity primary key,
nombre varchar(50),
descripcion varchar (5000),
usuario varchar(20) references Usuarios(usuario)
)
GO

create table Comentarios(


idcomentario int identity,
usuario varchar(20) references Usuarios(usuario),
idpost int references Posts(idpost) on delete cascade,
comentario varchar(5000) not null,
hora datetime not null
)

3. Luego de definir la estructura, creara lo siguientes procedimientos almacenados, de tal manera que
sea la base de datos la que se encargue de realizar las gestiones de datos sobre la base de datos
misma. Ejecute los siguientes bloques de SQL.
Si alguno le da error, proceda a ejecutarlos de forma individual.
create proc insusuario(
@usuario varchar(20) ,
@password varchar (20) ,
@nombre varchar(50) ,
@apellido varchar(50) ,
@pais int,
@sexo char(1),
@correo varchar(50),
@telefono varchar(30)
)
as insert into usuarios values(@usuario,@password,@nombre,@apellido,@pais,@sexo,@correo,@telefono)
GO

Desarrollo de aplicaciones con software propietario 4

Gua #11: Aplicaciones en capas en ASP.NET

create proc insComentario(


@usuario varchar(20),
@idpost int,
@comentario varchar(5000)
)
as insert into comentarios values(@usuario,@idpost,@comentario,GETDATE())
GO

create proc delPost(


@idpost int
)
as delete from posts where idpost=@idpost
GO

create proc insPost(


@nombre varchar(50),
@descripcion varchar(5000),
@usuario varchar(20)
)
as insert into Posts values (@nombre, @descripcion,@usuario)
GO

create proc updPost(


@nombre varchar(50),
@descripcion varchar(5000),
@idpost int
)
as update posts set nombre = @nombre, descripcion = @descripcion where idpost = @idpost
GO

Cada uno de los procedimientos anteriores cumple cierta funcin especfica.


insusuario: Servira para insertar un usuario a las base de datos.
insComentario: Insertara un comentario realizado por un usuario en un post determinado.
delPost: Borrara un post determinado.
insPost: Insertara un post a un usuario determinado.
updPost: Modificara un post determinado.

Desarrollo de aplicaciones con software propietario 5

Gua #11: Aplicaciones en capas en ASP.NET

4. Ahora nos resta nicamente agregar registros a las tablas. Proceda a ejecutar las siguientes
instrucciones INSERT. Tenga especial cuidado de verificar adonde inicia y adonde terminan las
instrucciones.
insert
into
usuarios
('pedro','demo','Pedro','Rodriguez',21,'M','pedrorodriguez@gmail.com','3827982173')

values

insert into usuarios values ('ana','demo','Ana','Huemil',1,'F','ana_huemil@hotmail.com','384872828')


insert into usuarios values ('juan','demo','Juan','Vazquez',9,'M','juan.vazquez.yahoo.com','323413214')

insert into Posts values ('Funcionamiento basico del Foro','Descripcion de Funciones del Foro','juan')
insert into Posts values ('Programando en ASP','Programa basico de asp','pedro')
insert into Posts values ('Crear un foro basico','Hola gente!!! Estoy haciendo un site y en una parte
necesito hacer un foro,
no tiene que ser nada increible ni nada muy grande, solamente poder postear mensajes y autor del mensaje...
El tema es que en este momento me estaba por poner a programarlo y me surgieron varias dudas en cuanto a el
funcionamiento, osea donde guardo los mensajes principalmente... Yo tenia penasdo hacer alguna cosa con
archivos
indexados en una base de datos (mysql) para no cargarla mucho....
Pero antes de ponerme a hacer esto me puse a buscar en internet y encontre que en varios lados "ensean" a
crear
un foro guardando toda la informacion en la base de datos y armando los "threds" haciendo consultas que
filtren
todo lo que no es del tema especificado... en estos lugares que comento guardan el texto, osea el cuerpo
del
mensaje en la base de datos, esto no la enlenteceria???? yo tenia "entendido" que habia que tratar de
guardar
la menor cantidad de informacion posible en las bases para tarden los menos posible en los manejos que
hacen...
pero es solo una idea mia, no se si sera verdad o no...
Alguien sabe como funcionan los foros posta??? o que me recomiendan hacer???
Este ultimo metodo de guardar todo en la base de datos es extremadamente facil,
porque armas los temas con consultas y no te tenes que preocupar de nada...
Pero tengo ganas de hacer algo lo mas "aproximado" a la realidad posible... no algo facilongo para salir
del paso....
Bueno, espero sus propuestas
saludos!!!!!!!','pedro')

insert into Comentarios values ('ana',3,'Hacete un favor y usa algo ya hecho. Con las dudas que tenes, la
magnitud del proyecto te supera ampliamente.',GETDATE())
insert into Comentarios values ('juan',3,'Puede que haya algn otro paquete que sea todava ms simple si
no ests buscando tantos features..',GETDATE())
insert into Comentarios values ('pedro',3,'gracias a todos, pero la verdad es que tengo ganas de hacerlo

Desarrollo de aplicaciones con software propietario 6

Gua #11: Aplicaciones en capas en ASP.NET

yo, porque es algo MUY simple... osea ni siquiera quiero hacer subforos, osea es un lugar donde se agregan
temas y se puede comentar esos temas, no es que entro y tengo 40 subforos... asi que voy a seguir
haciendolo por mi cuenta que de paso aprendo... muchas gracias a todos... saludos!',GETDATE())
insert into Comentarios values ('ana',1,'Como se crea un post??',GETDATE())
insert into Comentarios values ('juan',1,'Solo vaz a mis posts y seleccionas crear un post, le das un
titulo y una descripcion y por ultimo crear post',GETDATE())
insert into Comentarios values ('ana',1,'Gracias otra pregunta, como se borra un comentario??',GETDATE())

Parte 2: Creacin de conexin desde Visual Studio con el origen de datos.


5. Inicia Microsoft Visual Studio desde su computadora y prepara un nuevo Sitio Web vacio de
ASP.NET, bajo el nombre Guia11.
6. Descarga y descomprime los recursos complementarios de esta practica. Luego, copia las subcarpetas
de su contenido al interior de la carpeta de tu sitio web del procedimiento.
Retorna a la ventana de Visual Studio, dentro del Explorador de Soluciones, da clic secundario sobre el
icono del proyecto (Guia11) y selecciona la opcin Actualizar carpeta. Confirma que se agregan las
carpetas de recursos a la solucion.
7. Agrega en tu sitio web a un proyecto de librera de clases, dando clic en FILE, selecciona opcin ADD y
de clic en New Project. De la ventana emergente, en los proyectos de C#, ubica la categora Windows
y en la lista, selecciona el tipo de proyecto (Biblioteca de clases | Class Library).
Por ultimo, asigna Datos como nombre del Proyecto (observa la imagen) y presiona botn Aceptar.

Desarrollo de aplicaciones con software propietario 7

Gua #11: Aplicaciones en capas en ASP.NET

8. De la ventana del Explorador de Proyectos, seleccione la clase predeterminada (Class1.cs) y proceda a


borrarla de este nuevo proyecto.
9. Al interior de esta librera Datos, agregaremos TODOS los archivos necesarios para la gestin de la
comunicacin con la base de datos, de tal manera que este sea el nico punto de nuestro sitio que
tenga acceso a ella.
10. Dentro de la librera agregue una nueva clase con el nombre Configuracion.cs y proceda a digitar
el siguiente cdigo. Verifique todos los using que se han adicionado.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Datos
{
class Configuracion
{
static
string
cadenaConexion
=
Catalog=Aplicacion_Capas;Integrated Security=True";

@"Data

Source=localhost;Initial

public static string CadenaConexion


{
get { return cadenaConexion; }
}
}
}

11. Siempre al interior de la Libreria de Datos, proceda a crear una nueva clase con el nombre
MetodosDatos.cs y proceda a digitar el siguiente cdigo.
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;

namespace Datos
{

Desarrollo de aplicaciones con software propietario 8

Gua #11: Aplicaciones en capas en ASP.NET

class MetodosDatos
{
public static SqlCommand CrearComando()
{
string _cadenaConexion = Configuracion.CadenaConexion;
SqlConnection _conexion = new SqlConnection();
_conexion.ConnectionString = _cadenaConexion;
SqlCommand _comando = new SqlCommand();
_comando = _conexion.CreateCommand();
_comando.CommandType = CommandType.Text;
return _comando;
}

public static SqlCommand CrearComandoProc(string proc)


{
string _cadenaConexion = Configuracion.CadenaConexion;
SqlConnection _conexion = new SqlConnection(_cadenaConexion);
SqlCommand _comando = new SqlCommand(proc, _conexion);
_comando.CommandType = CommandType.StoredProcedure;
return _comando;
}

public static int EjecutarComando(SqlCommand comando)


{
try
{
comando.Connection.Open();
return comando.ExecuteNonQuery();
}
catch { throw; }
finally
{
comando.Connection.Dispose();
comando.Connection.Close();
}
}

Desarrollo de aplicaciones con software propietario 9

Gua #11: Aplicaciones en capas en ASP.NET

public static DataTable EjecutarComandoSelect(SqlCommand comando)


{
DataTable _tabla = new DataTable();
try
{
comando.Connection.Open();
SqlDataAdapter adaptador = new SqlDataAdapter();
adaptador.SelectCommand = comando;
adaptador.Fill(_tabla);
}
catch (Exception ex)
{ throw ex; }
finally
{ comando.Connection.Close(); }
return _tabla;
}

}
}

12. Siempre al interior de la libreria de Datos, crearemos una nueva clase en la capa de datos que se
llamar AccesoDatos.cs y tendra la funcion de autentificar y registrar a los usuarios. Digite el
siguiente cdigo.
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;

namespace Datos
{
public class AccesoDatos
{
public static int insertarUsuario(string usuario, string password, string nombre,
string apellido, int pais, char sexo, string correo, string telefono)

Desarrollo de aplicaciones con software propietario 10

Gua #11: Aplicaciones en capas en ASP.NET

{
SqlCommand _comando = MetodosDatos.CrearComandoProc("insUsuario");
_comando.Parameters.AddWithValue("@usuario", usuario);
_comando.Parameters.AddWithValue("@password", password);
_comando.Parameters.AddWithValue("@nombre", nombre);
_comando.Parameters.AddWithValue("@apellido", apellido);
_comando.Parameters.AddWithValue("@pais", pais);
_comando.Parameters.AddWithValue("@sexo", sexo);
_comando.Parameters.AddWithValue("@correo", correo);
_comando.Parameters.AddWithValue("@telefono", telefono);
return MetodosDatos.EjecutarComando(_comando);
}

public static DataTable verificarUsuario(string usuario, string pass)


{
SqlCommand _comando = MetodosDatos.CrearComando();
_comando.CommandText = "SELECT usuario FROM usuarios WHERE usuario = '"
usuario + "' AND password = '" + pass + "'";

return MetodosDatos.EjecutarComandoSelect(_comando);
}
}
}

13. Siempre al interior de la librera de Datos,


crearemos una carpeta nueva que contendr
los mtodos ordenados por formulario.
Haga click derecho en la capa de Datos y
seleccionar Agregar.
En el men emergente nueva carpeta, coloca
el nombre Views. Hasta este momento, su
estructura debe verse como sigue:

14. Al interior de la carpeta Views del paso anterior, crear


misComentariosDatos.cs, y proceder a digitar el siguiente cdigo:

Desarrollo de aplicaciones con software propietario 11

una

clase

llamada

Gua #11: Aplicaciones en capas en ASP.NET

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;

namespace Datos.Views
{
public class misComentariosDatos
{
public static DataTable ObtenerComentarios(string usuario)
{
SqlCommand _comando = MetodosDatos.CrearComando();
_comando.CommandText = "SELECT hora, nombre, comentario FROM comentarios
INNER JOIN posts ON comentarios.idpost = posts.idpost WHERE comentarios.usuario = '" +
usuario + "'";
return MetodosDatos.EjecutarComandoSelect(_comando);
}

}
}

15. De nuevo en la carpeta Views, crea otra clase llamada miperfilDatos.cs y proceda a digitar el
siguiente cdigo:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;

namespace Datos.Views
{
public class miperfilDatos
{

Desarrollo de aplicaciones con software propietario 12

Gua #11: Aplicaciones en capas en ASP.NET

public static DataTable obtenerDatos(string usuario)


{
SqlCommand _comando = MetodosDatos.CrearComando();
_comando.CommandText = "SELECT * FROM Usuarios WHERE usuario ='" + usuario
+ "'";
return MetodosDatos.EjecutarComandoSelect(_comando);
}
}
}

16. En la carpeta Views, agregue otra clase llamada misPostsDatos.cs, y proceder a digitar el siguiente
cdigo:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;

namespace Datos.Views
{
public class misPostsDatos
{
public static DataTable obtenerMisPosts(string usuario)
{
SqlCommand _comando = MetodosDatos.CrearComando();
_comando.CommandText = "SELECT idpost,nombre,descripcion FROM posts WHERE
usuario = '" + usuario + "'";
return MetodosDatos.EjecutarComandoSelect(_comando);
}

public static int eliminarPost(int post)


{
SqlCommand _comando = MetodosDatos.CrearComandoProc("delPost");
_comando.Parameters.AddWithValue("@idpost", post);
return MetodosDatos.EjecutarComando(_comando);
}

Desarrollo de aplicaciones con software propietario 13

Gua #11: Aplicaciones en capas en ASP.NET

public

static

int

insertarPost(string

nombre,

string

descripcion,

string

usuario)
{
SqlCommand _comando = MetodosDatos.CrearComandoProc("insPost");
_comando.Parameters.AddWithValue("@nombre", nombre);
_comando.Parameters.AddWithValue("@descripcion", descripcion);
_comando.Parameters.AddWithValue("@usuario", usuario);
return MetodosDatos.EjecutarComando(_comando);
}

public static int actualizarPost(string nombre, string descripcion, int post)


{
SqlCommand _comando = MetodosDatos.CrearComandoProc("updPost");
_comando.Parameters.AddWithValue("@nombre", nombre);
_comando.Parameters.AddWithValue("@descripcion", descripcion);
_comando.Parameters.AddWithValue("@idpost", post);
return MetodosDatos.EjecutarComando(_comando);
}

public static DataTable obtenerDatosPosts(int post)


{
SqlCommand _comando = MetodosDatos.CrearComando();
_comando.CommandText = "SELECT nombre,descripcion FROM posts WHERE idpost
= " + post;
return MetodosDatos.EjecutarComandoSelect(_comando);
}
}
}

17. En la carpeta Views, agregue una nueva clase llamada todosPostsDatos.cs y proceda a digitar el
siguiente cdigo:
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;

Desarrollo de aplicaciones con software propietario 14

Gua #11: Aplicaciones en capas en ASP.NET

namespace Datos.Views
{
public

class todosPostsDatos

{
public static DataTable obtenerTodosPosts()
{
SqlCommand _comando = MetodosDatos.CrearComando();
_comando.CommandText = "SELECT * FROM posts";
return MetodosDatos.EjecutarComandoSelect(_comando);
}

public static DataTable obtenerInfoPost(int post)


{
SqlCommand _comando = MetodosDatos.CrearComando();
_comando.CommandText = "SELECT * FROM posts WHERE idpost=" + post;
return MetodosDatos.EjecutarComandoSelect(_comando);
}

public static DataTable obtenerComentarios(int post)


{
SqlCommand _comando = MetodosDatos.CrearComando();
_comando.CommandText = "SELECT * FROM comentarios WHERE idpost=" + post;
return MetodosDatos.EjecutarComandoSelect(_comando);
}

public
comentario)

static

int

insertarComentario(string

usuario,

int

post,

string

{
SqlCommand _comando = MetodosDatos.CrearComandoProc("insComentario");
_comando.Parameters.AddWithValue("@usuario", usuario);
_comando.Parameters.AddWithValue("@idpost", post);
_comando.Parameters.AddWithValue("@comentario", comentario);
return MetodosDatos.EjecutarComando(_comando);
}
}
}

Desarrollo de aplicaciones con software propietario 15

Gua #11: Aplicaciones en capas en ASP.NET


18. Hasta el momento, hemos definido toda nuestra capa de datos. Ahora es necesario implementar la
manera en que debemos consumir dichas clases.
Dentro de la solucin agregue otra (Librera de Clase / Class Library) con el nombre Negocio
19. Luego, para que nuestra clase Negocio utilice las libreras de clases de Datos que hemos creado,
debemos agregar la referencia a nuestro proyecto.
En el Explorador de Soluciones, haga clic secundario en el nombre de la librera de clase Negocio,
luego seleccione Agregar referencia
En la nueva ventana, ubique a la izquierda a la opcin Solucion y marque Datos. Confirme en
Aceptar.

20. Luego, en el Explorador de Objetos, de clic sobre la carpeta de esta librera Negocios y agregue una
nueva clase con el nombre AccesoLogica.cs. Aqu proceda a digitar el siguiente cdigo:
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using Datos;
namespace Negocio
{

Desarrollo de aplicaciones con software propietario 16

Gua #11: Aplicaciones en capas en ASP.NET

public class AccesoLogica


{
public static bool insertarUsuario(string usuario, string password, string
nombre, string apellido, int pais, char sexo, string correo, string telefono)
{
try
{

if (AccesoDatos.insertarUsuario(usuario, password, nombre, apellido,


pais, sexo, correo, telefono) != 0)
return true;
else
return false;
}
catch
{
return false;
}
}

public static bool verificarUsuario(string usuario, string pass)


{
try
{
DataTable datos = AccesoDatos.verificarUsuario(usuario, pass);
if (datos.Rows.Count != 0)
return true;
else
return false;
}
catch
{
return false;
}
}
}
}

Desarrollo de aplicaciones con software propietario 17

Gua #11: Aplicaciones en capas en ASP.NET

21. Ahora, crearemos las clases de lgica para cada vista. Cree una nueva carpeta dentro de la librera
Negocio a la que llamar Views.
Dentro de esta agregue una clase llamada misComentariosNeg.cs y proceda a digitar el siguiente
cdigo.
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using Datos;
using Datos.Views;

namespace Negocio.Views
{
class misComentariosNeg
{
public static DataTable obtenerComentarios(string usuario)
{

return misComentariosDatos.ObtenerComentarios(usuario);
}

}
}

22. Al interior de la carpeta Views, crea otra clase llamada misPostsNeg.cs y procede a digitar el
siguiente cdigo:
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using Datos.Views;

Desarrollo de aplicaciones con software propietario 18

Gua #11: Aplicaciones en capas en ASP.NET

namespace Negocio.Views
{
public class misPostsNeg
{
public static DataTable obtenerMisPosts(string usuario)
{
return misPostsDatos.obtenerMisPosts(usuario);
}

public static DataTable obtenerDatosPosts(int post)


{
return misPostsDatos.obtenerDatosPosts(post);
}

public static bool eliminarPost(int post)


{
try
{
if (misPostsDatos.eliminarPost(post) != 0)
return true;
else
return false;
}
catch
{
return false;
}
}

public static bool insertarPost(string nombre, string descripcion, string


usuario)
{
try
{
if (misPostsDatos.insertarPost(nombre, descripcion, usuario) != 0)
return true;
else

Desarrollo de aplicaciones con software propietario 19

Gua #11: Aplicaciones en capas en ASP.NET

return false;
}
catch
{
return false;
}
}
public static bool actualizarPost(string nombre, string descripcion, int post)
{
try
{
if (misPostsDatos.actualizarPost(nombre, descripcion, post) != 0)
return true;
else
return false;
}
catch
{
return false;
}
}

}
}

23. Al interior de la carpeta Views, crea una clase llamada perfilNeg.cs. Procede a digitar el siguiente
cdigo:
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using Datos.Views;

namespace Negocio.Views

Desarrollo de aplicaciones con software propietario 20

Gua #11: Aplicaciones en capas en ASP.NET

{
public

class perfilNeg

{
public static DataTable obtenerDatos(string usuario)
{
return miperfilDatos.obtenerDatos(usuario);
}

}
}

24. Al interior de la carpeta View crear una clase llamada todosPostNeg.cs, y proceder a digitar el
siguiente cdigo:
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using Datos.Views;

namespace Negocio.Views
{
class todosPostNeg
{
public static DataTable obtenerTodosPosts()
{
return todosPostsDatos.obtenerTodosPosts();
}

public static DataTable obtenerInfoPost(int post)


{
return todosPostsDatos.obtenerInfoPost(post);
}

public static DataTable obtenerComentarios(int post)


{

Desarrollo de aplicaciones con software propietario 21

Gua #11: Aplicaciones en capas en ASP.NET

return todosPostsDatos.obtenerComentarios(post);
}

public static bool insertarComentario(string usuario, int post, string comentario)


{
try
{
if (todosPostsDatos.insertarComentario(usuario, post, comentario) != 0)
return true;
else
return false;
}
catch
{
return false;
}
}

public static string depurarComentario(string str)


{
string temp = str.Replace("<", "");
temp = temp.Replace(">", "");
temp = temp.Replace("&", "");
return temp;
}

}
}

25. Ahora, procederemos a la creacin de las vistas. En el explorador de soluciones, ubique el icono de la
solucion principal Guia11 y agregue un nuevo Web Form con el nombre Default.aspx.
Proceda a digitar el siguiente cdigo.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default"
%>

<!DOCTYPE

html

PUBLIC

"-//W3C//DTD

Desarrollo de aplicaciones con software propietario 22

XHTML

1.0

Strict//EN"

Gua #11: Aplicaciones en capas en ASP.NET

"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head runat="server">
<title></title>
<link href="~/Styles/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form runat="server">
<div class="page">
<div class="header">
<div class="title">
<h1>
FORO TRES CAPAS ASP.NET
</h1>
</div>
<div class="clear hideSkiplink">
<asp:Menu
ID="NavigationMenu"
runat="server"
EnableViewState="false" IncludeStyleBlock="false" Orientation="Horizontal">

CssClass="menu"

<Items>
<asp:MenuItem NavigateUrl="~/Principal.aspx" Text="Home"/>
<asp:MenuItem NavigateUrl="~/About.aspx" Text="Acerca"/>
</Items>
</asp:Menu>
</div>
</div>
<div class="main">
<h2>
Inicio de Sesin
</h2>
<div>
<asp:Panel ID="pandefaultbtn" runat="server" DefaultButton="btnEntrar">

<fieldset class="login">
<label>Usuario</label>
<asp:TextBox
CssClass="textEntry"></asp:TextBox>

ID="txtusuario"

<label>Contrasea</label>

Desarrollo de aplicaciones con software propietario 23

runat="server"

Gua #11: Aplicaciones en capas en ASP.NET

<asp:TextBox ID="txtPassword"
CssClass="passwordEntry"></asp:TextBox>

TextMode="Password"

runat="server"

<div class="clear"></div>
<p></p>
<asp:ImageButton
ID="btnEntrar"
runat="server" Height="40px" Width="134px" />

ImageUrl="~/images/login.png"

<asp:ImageButton ID="btnRegistrar"
runat="server" Height="38px" Width="150px" />

ImageUrl="~/images/register.png"

<asp:Label ID="lblMsg"
Overline="False" Font-Strikeout="False"

runat="server"

Font-Names="Impact"

Font-

ForeColor="Maroon"></asp:Label>

</fieldset>

</asp:Panel>
</div>
<br />
</div>
<div class="clear">
</div>
</div>
<div class="footer">

</div>
</form>
</body>
</html>

26. Para que nuestro sitio web pueda utilizar las libreras de clases que hemos creado, debemos agregar la
referencia a nuestro proyecto.
En el explorador de soluciones, haga clic con el botn secundario del mouse en el nombre del
proyecto Guia11.
A continuacin, haga clic en Agregar referencia web y seleccione a Negocio.

Desarrollo de aplicaciones con software propietario 24

Gua #11: Aplicaciones en capas en ASP.NET

27. Ya podemos agregar el espacio de nombre a todos nuestros proyectos. Ingrese al archivo
Default.aspx.cs de la pag. anterior y agregue la referencia (resaltada a continuacion) hacia nuestra
librera de clases (Negocios)

28. Ahora, en el evento PageLoad de la pgina Default digite el siguiente cdigo:


protected void Page_Load(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty((string)Session["StatusMessage"]))
{
string mensaje = (string)Session["StatusMessage"];
Session["StatusMessage"] = null;
Response.Write("<script
<![CDATA[alert(\""+mensaje+"\")// ]]></script>");

type='text/javascript'>//

}
}

29. De manera similar, digite el siguiente cdigo en los respectivos eventos de los botones de esta pagina
Default

Desarrollo de aplicaciones con software propietario 25

Gua #11: Aplicaciones en capas en ASP.NET

protected void btnRegistrar_Click(object sender, ImageClickEventArgs e)


{
Session["CrearUsuario"] = "Valido";
Response.Redirect("~/Registro.aspx");
}

protected void btnEntrar_Click(object sender, ImageClickEventArgs e)


{
if (AccesoLogica.verificarUsuario(txtusuario.Text, txtPassword.Text))
{
Session["Start"] = 0;
Session["Nombre"] = txtusuario.Text;
Response.Redirect("~/Views/Perfil.aspx");
}
else
{
lblMsg.Text = "Password o Usuario incorrecto";
}
}

30. Cree una nueva pgina con el nombre de Registro.aspx y proceda a digitar el siguiente marcado:
<%@
Page
Language="C#"
Inherits="Registro" %>

AutoEventWireup="true"

<!DOCTYPE
html
PUBLIC
"-//W3C//DTD
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

CodeFile="Registro.aspx.cs"

XHTML

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">


<head runat="server">
<title></title>
<link href="~/Styles/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form runat="server">
<div class="page">
<div class="header">
<div class="title">

Desarrollo de aplicaciones con software propietario 26

1.0

Strict//EN"

Gua #11: Aplicaciones en capas en ASP.NET

<h1>
FORO TRES CAPAS ASP.NET
</h1>
</div>
</div>
<div class="main">
<h2>
Registro de usuarios
</h2>
<div>
<asp:Panel ID="pandefaultbtn" runat="server" DefaultButton="Button1">

<fieldset class="register">
<label>Usuario</label>
<asp:TextBox
CssClass="textEntry"></asp:TextBox>

ID="txtusuario"

runat="server"

<label>Contrasea</label>
<asp:TextBox ID="txtPassword"
CssClass="passwordEntry"></asp:TextBox>

TextMode="Password"

runat="server"

<label>Nombres</label>
<asp:TextBox
CssClass="textEntry"></asp:TextBox>

ID="txtNombre"

runat="server"

ID="txtApellido"

runat="server"

<label>Apellidos</label>
<asp:TextBox
CssClass="passwordEntry"></asp:TextBox>
<label>Pas</label>
<asp:DropDownList

ID="ddlPaises"

CssClass="textEntry">
<asp:ListItem Value="1">El Salvador</asp:ListItem>
<asp:ListItem Value="2">Guatemala</asp:ListItem>
<asp:ListItem Value="3">Honduras</asp:ListItem>
<asp:ListItem Value="4">Nicaragua</asp:ListItem>
<asp:ListItem Value="5">Costa Rica</asp:ListItem>
<asp:ListItem Value="6">Panam</asp:ListItem>
</asp:DropDownList>
<label>Sexo</label>
<asp:DropDownList ID="ddlSexo" runat="server">
<asp:ListItem Value="M">Masculino</asp:ListItem>

Desarrollo de aplicaciones con software propietario 27

runat="server"

Gua #11: Aplicaciones en capas en ASP.NET

<asp:ListItem Value="F">Femenino</asp:ListItem>
</asp:DropDownList>
<label>E-mail</label>
<asp:TextBox
CssClass="textEntry"></asp:TextBox>

ID="txtCorreo"

runat="server"

ID="txtTelefono"

runat="server"

<label>Telfono</label>
<asp:TextBox
CssClass="passwordEntry"></asp:TextBox>
<div class="clear"></div>
<p></p>
<asp:Button
ID="Button1"
CssClass="submitButton" OnClick="Button1_Click" />

<asp:Label

ID="lblMsg"

runat="server"

runat="server"

Font-Overline="False"

Strikeout="False"
ForeColor="Maroon"></asp:Label>

</fieldset>

</asp:Panel>
</div>
<br />
</div>
<div class="clear">
</div>
</div>
<div class="footer">

</div>
</form>
</body>
</html>

Desarrollo de aplicaciones con software propietario 28

Text="Registrar"

Font-

Gua #11: Aplicaciones en capas en ASP.NET


31. Ingrese al cdigo del archivo (Registro.aspx.cs) de la pagina anterior e incluya la referencia al
namespace Negocio.
Luego, programe el evento clic del botn Registrar (Button1) de la pagina anterior de la siguiente
manera:

protected void Button1_Click(object sender, EventArgs e)


{
if (AccesoLogica.insertarUsuario(txtusuario.Text, txtPassword.Text, txtNombre.Text,
txtApellido.Text,
int.Parse(ddlPaises.SelectedValue.ToString()),
char.Parse(ddlSexo.SelectedValue), txtCorreo.Text, txtTelefono.Text))
{
Session["Start"] = 0;
Session["Nombre"] = txtusuario.Text;
Response.Redirect("~/Views/Perfil.aspx");
}
else
{
lblMsg.Text = "Error al ingresar registro. Verifique";
}
}

32. Ahora, cree una carpeta llamada Views. Aqu crearemos dos de las vistas a utilizar en nuestro
proyecto.
Dentro de esta carpeta cree la pgina Perfil.aspx y digite el siguiente marcado:
<%@
Page
Language="C#"
Inherits="Views_Perfil" %>

AutoEventWireup="true"

<!DOCTYPE
html
PUBLIC
"-//W3C//DTD
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

CodeFile="Perfil.aspx.cs"

XHTML

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">


<head runat="server">
<title></title>
<link href="~/Styles/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form runat="server">
<div class="page">
<div class="header">

Desarrollo de aplicaciones con software propietario 29

1.0

Strict//EN"

Gua #11: Aplicaciones en capas en ASP.NET

<div class="title">
<h1>
FORO TRES CAPAS ASP.NET
</h1>
</div>
<div class="clear hideSkiplink">
<asp:Menu
ID="NavigationMenu"
runat="server"
EnableViewState="false" IncludeStyleBlock="false" Orientation="Horizontal">

CssClass="menu"

<Items>
<asp:MenuItem
Text="Inicio"></asp:MenuItem>

NavigateUrl="~/Default.aspx"

<asp:MenuItem NavigateUrl="~/Views/Perfil.aspx" Text="Mi Perfil"/>


<asp:MenuItem NavigateUrl="~/Views/MisPost.aspx" Text="Mis Post"/>
</Items>
</asp:Menu>
</div>
</div>
<div class="main">
<h2>
Mi Perfil
</h2>
<div class="rounded_corners">
<asp:DetailsView
ID="DetailsView1"
runat="server"
Height="50px"
Width="500px"
HeaderStyle-BackColor="#3AC0F2"
HeaderStyle-ForeColor="White"
RowStyleBackColor="#A1DCF2"
AlternatingRowStyle-BackColor="White"
ForeColor="#3A3A3A"></asp:DetailsView>
</div>
<br />
</div>
<div class="clear">
</div>
</div>
<div class="footer">

</div>
</form>
</body>

Desarrollo de aplicaciones con software propietario 30

RowStyle-

Gua #11: Aplicaciones en capas en ASP.NET

</html>

33. Ingrese al archivo (Perfil.aspx.cs) de la nueva pagina y agregue el siguiente espacio de nombre
Negocio.Views.

34. Ahora, en el PageLoad de la misma pgina, digite el siguiente cdigo:


protected void Page_Load(object sender, EventArgs e)
{
if (Session["Nombre"] != "") {
DetailsView1.DataSource = perfilNeg.obtenerDatos(Session["Nombre"].ToString());
DetailsView1.DataBind();
}
}

35. Dentro de la carpeta Views cree una nueva pgina llamada MisPost.aspx y digite el siguiente
marcado:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="MisPost.aspx.cs" Inherits="MisPost"
%>

<!DOCTYPE
html
PUBLIC
"-//W3C//DTD
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

XHTML

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">


<head runat="server">
<title></title>
<link href="~/Styles/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
<form runat="server">
<div class="page">
<div class="header">
<div class="title">
<h1>

Desarrollo de aplicaciones con software propietario 31

1.0

Strict//EN"

Gua #11: Aplicaciones en capas en ASP.NET

FORO TRES CAPAS ASP.NET


</h1>
</div>
<div class="clear hideSkiplink">
<asp:Menu
ID="NavigationMenu"
runat="server"
EnableViewState="false" IncludeStyleBlock="false" Orientation="Horizontal">

CssClass="menu"

<Items>
<asp:MenuItem
Text="Inicio"></asp:MenuItem>

NavigateUrl="~/Default.aspx"

<asp:MenuItem NavigateUrl="~/Views/Perfil.aspx" Text="Mi Perfil"/>


<asp:MenuItem NavigateUrl="~/Views/MisPost.aspx" Text="Mis Post"/>
</Items>
</asp:Menu>
</div>
</div>
<div class="main">
<h2>
Mis Post
</h2>
<style type="text/css">
</style>

<asp:Repeater ID="Repeater1" runat="server">


<ItemTemplate>
<div class="rounded_corners">
<h2 class="titulo">
<%# DataBinder.Eval(Container.DataItem,"idpost") %>.
<%# DataBinder.Eval(Container.DataItem,"nombre") %>
</h2>
<p><%# DataBinder.Eval(Container.DataItem,"descripcion") %></p>
</div>
<br />
</ItemTemplate>
</asp:Repeater>

<br />
</div>

Desarrollo de aplicaciones con software propietario 32

Gua #11: Aplicaciones en capas en ASP.NET

<div class="clear">
</div>
</div>
<div class="footer">

</div>
</form>
</body>
</html>

36. Ingrese al archivo MisPost.aspx de la pagina anterior e incluya la referencia al espacio de nombres
Negocio.Views.
Despues, proceda a digitar el siguiente cdigo en el Page_Load de esta pgina.
protected void Page_Load(object sender, EventArgs e)
{
if (Session["Nombre"] != "")
{
Repeater1.DataSource
misPostsNeg.obtenerMisPosts(Session["Nombre"].ToString());

Repeater1.DataBind();
}
}

Parte 3: Pruebas de la aplicacin


37. Retorne a la ventana de Microsoft SQL Server Manager Visual Studio. En el explorador de Objetos,
ubique y expanda la base de datos Aplicacin_Capas. Visualice los registros de la tabla Usuarios.
38. Retorne a la ventana del proyecto de Visual Studio y proceda a ejecutar la pgina Default.aspx.
Ingrese con un usuario y contrasea de usuario ya registrado (seleccionado del paso anterior),
seleccin ficha Mis Post.
39. Regrese a la ficha Home y presione boton Register. Agregue los datos de un nuevo usuario y presione
al boton Registrar. Luego desde SQL, confirme que este usuario se agrego en la tabla Usuario.

V. BIBLIOGRAFA
1.

Thierry GROUSSARD. (2013). C# 5: Los fundamentos del lenguaje Desarrollar con Visual Studio 2012 .
Barcelona: ENI.

Desarrollo de aplicaciones con software propietario 33

You might also like