jueves, 16 de junio de 2011

Aplicación ASP.NET (parte 1)

Hola nuevamente, esta semana anduve enfrascado en una aplicación doble, para gestión de recursos de proveedores y ventas de artículos, con sus reportes y todo lo que engloba.

Para la aplicación se requería una parte de escritorio que gestione los usuarios de cada proveedor (podían ser más de uno), y que se le pueda hacer mantenimiento, nada del otro mundo, para no entorpecer el ambiente de Producción decidí elaborar una tabla alterna tipo puente que albergue el código del proveedor y le asigne un usuario; al comienzo me pareció una mala idea pero con el requerimiento que se vino  luego (lo de generar más de un usuario), ayudó mucho ya que con un índice superior podía gestionar los usuarios de forma independiente.

La segunda parte era construir un web site que haga uso de las estructuras y consultas a la información almacenada.





Como expliqué tenemos una aplicación que gestiona usuarios así que debemos empezar por el login. En nuestro proyecto web generamos una nueva página que será la inicial del proyecto.
Es ASP.NET así que arrastramos el control de Login, que nos viene preconfigurado con los campos de usuario, contraseña y si le echan un vistazo a las propiedades verán que tiene mucha funcionalidad, pueden cambiarle los mensajes a español manualmente o utilizar las "culturas" de .NET.

Debería lucir algo como esto:
El candado y las líneas no son parte del componente, eso lo haces con algo de css y maquetación. No te sorprendas si tu control no se ve como este una vez que lo colocas o lo seleccionas aparecerá una flecha en la parte superior derecha que te mostrará un menú con una opción de autoformato:
Ahí pueden elegir en estilo preconfigurado que poseen los controles.
Hasta ahí tenemos un control algo configurado, puedes levantar la página con F5; pero no tendrá funcionalidad porque no lo hemos enlazado en sí a nuestro repositorio de datos. Vamos con el código de importancia, hacemos click derecho sobre nuestro formulario y le damos a la opción "view code", nos llevará al .VB en donde tenemos el código fuente de la funcionalidad:
Agregamos en la parte superior antes de la declaración de la clase lo siguiente:

Imports System
Imports System.Data.SqlClient

Con estas líneas podremos utilizar las librerías de conexión a SqlServer.

En la función de Load colocamos el siguiente código:

        If Not Me.IsPostBack Then
            ViewState("LoginErrors") = 0
        End If

Con esto controlamos que en la primera carga no se registren errores de login sobre nuestro control.

Yo declaro una función para realizar la consulta de autenticación:

Private Function MiValidar(ByVal UserName As String, ByVal Password As String) As Boolean

Haber recibe 2 string y returna un boolean, que será True si el usuario existe, colocó bien sus credenciales y está activado en nuestra web para ingresar.
Luego declaro dentro de la función las siguientes variables:

        Dim boolReturnValue As Boolean
        Dim MyConnection As SqlConnection
        Dim MyDataAdapter As SqlDataAdapter
        Dim conexion As String
        Dim reader As SqlDataReader

boolReturnValue: es la variable que retorna mi función.
MyConnection: Variable de conexión de tipo Sql.
MyDataAdapter: Clase que realiza la consulta (lo utilizo porque trabajo todo en base a procedimientos almacenados).
conexion: Cadena que almacenará la cadena de conexión.
reader: variable que me permitirá leer los datos de la consulta realizada con el DataAdapter.

Para iniciar todo y en caso de falla igualamos el bool a False:
        boolReturnValue = False
Luego completamos la función con la siguiente parte:
        Try 'Lo colocamos para gestioanr errores 
            conexion = ConfigurationManager.ConnectionStrings("CadenaConexion").ToString 'Esta parte la utilizamos para obtener la cadena de nuestro WebConfig previamente ya hemos creado un DataSource

            MyConnection = New SqlConnection(conexion) 'Construimos la nueva conexión con SqlConnection

            MyDataAdapter = New SqlDataAdapter("NombreProcedimeinto", MyConnection) 'Seteamos el nombre del procedimiento y la conexión que utilizará.

            MyDataAdapter.SelectCommand.CommandType = CommandType.StoredProcedure 'Le damos el tipo de comando que ejecutará en DataAdapter.

            MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@cod", SqlDbType.VarChar, 25)) 'Definimos el Parámetro para luego darle el valor
            MyDataAdapter.SelectCommand.Parameters("@cod").Value = UserName 'Le damos el valor del UserName al parámetro creado.

            MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@user", SqlDbType.VarChar, 25))
            MyDataAdapter.SelectCommand.Parameters("@user").Value = UserName

            MyDataAdapter.SelectCommand.Parameters.Add(New SqlParameter("@pass", SqlDbType.VarChar, 25))
            MyDataAdapter.SelectCommand.Parameters("@pass").Value = Password
'En esta parte seteamos los valores para cada parámetro teniendo en cuenta los definidos en nuestro procedimiento.
            MyConnection.Open() 'Abrimos la conexión para poder ejecutar nuestro DataAdapter

            reader = MyDataAdapter.SelectCommand.ExecuteReader() 'Ejecutamos el adapter con la opción que llena nuestro DataReader.

            If reader.HasRows Then 'Si el reader tiene data, lo leemos
                Do While reader.Read()
                    Session.Add("codprov", reader.GetInt32(0)) 'Asigno el código de proveedor a una variable de sesión
                    Session.Add("nomprov", reader.GetString(1)) 'Asigno el nombre del proveedor
                Loop
                boolReturnValue = True 'Si hemos llegado hasta aquí es porque andamos bien y devolvemos True
            Else
                boolReturnValue = False
            End If
        Catch ex As Exception
            MsgBox(ex.Message.ToString(), MsgBoxStyle.Critical, "error") ' Control de errores, nos permitirá saber en qué nos hemos equivocado.
        End Try
Y al final de estas líneas podemos retiornar el bool:
        Return boolReturnValue
Activamos la propiedad Autenticate de nuestro control Login para agregar el siguiente código:
    Private Sub LoginCont_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs) Handles LoginCont.Authenticate
        If MiValidar(LoginCont.UserName, LoginCont.Password) Then 'Validamos la función creada anteriormente
            LoginCont.Visible = False 'Si es verdadera desaparecemos el control Login
            Response.Redirect("Página2.aspx") ' Redireccionamos a donde deseamos que se dirija si es que tiene autorización
        Else

            e.Authenticated = False 'de lo contrario decimos que no se pudo autenticar.

        End If
    End Sub
Para terminar implementamos el Evento de LoginError del Componente Login, el código que utilicé es el siguiente:
    Private Sub LoginCont_LoginError(ByVal sender As Object, ByVal e As System.EventArgs) Handles LoginCont.LoginError
        If ViewState("LoginErrors") Is Nothing Then

            ViewState("LoginErrors") = 0

        End If

        Dim ErrorCount As Integer = CInt(ViewState("LoginErrors")) + 1

        ViewState("LoginErrors") = ErrorCount

        If (ErrorCount > 3) AndAlso (LoginCont.PasswordRecoveryUrl <> String.Empty) Then

            Response.Redirect(LoginCont.PasswordRecoveryUrl)

        End If
    End Sub
No hay mucho que explicar más que si el estado "LoginErrors" es diferente de 0 te muestra el mensaje de error; y si los intentos son 3 te envía a la página de recuperación de contraseña, la cual también debemos implementar.
Bien eso sería todo para esta entrada, si tienen alguna duda pueden comentarla. Gracias.

No hay comentarios:

Publicar un comentario