28/12/2011

Implementar Membership Providers con Oracle y Visual Studio 2010

Hace algún tiempo atrás, escribí unos artículos sobre la implementación de Membresía (Gestión de Usuarios, Roles y Perfiles) en ASP .NET 2.0 haciendo uso de proveedores de ASP .NET y los controles específicos para estas tareas comunes, aquí pueden ver la parte 1 y la parte 2.

Ahora veremos de manera similar como implementar esto pero no usando el motor de base de datos SQL Server, sino configurar los providers para trabajar con Oracle desde Visual Studio 2010.

Requisitos:

ODAC 11.2 Release 3 (11.2.0.2.1) with Oracle Developer Tools for Visual Studio

Esto nos dará la posibilidad de usar los providers de asp .net con Oracle, ahora paso a detallar como podemos lograrlo:

Crear un nuevo proyecto

Para este ejemplo crearemos un nuevo proyecto de tipo "Aplicación Web ASP .NET" con la plantilla por defecto del Visual Studio
Configurar el proveedor de Oracle

Una vez tenemos la aplicación creada, nos vamos al archivo web.config y eliminamos los tags de:
- Membsership
- Profile
- RoleManager
Ahora abrimos la herramienta de administración de sitios de asp .net en Proyecto->Configuración de ASP .NET
Fig. 1 - Configuración de Proveedores
Nos dirigimos a la pestaña "Proveedor"  y accedemos al enlace "Seleccionar un proveedor distinto para cada característica (avanzado)", dentro de esta pantalla marcamos como Proveedor de Pertenencia a "OracleMembershipProvider" y como Proveedor de funciones  a "OracleRoleProvider", esto nos modificará nuevamente el archivo web.config, pero ya con los proveedores de Oracle.
3. Generar las tablas

Una vez configurados los proveedores de pertenencia (Membership) y funciones (Roles) tenemos que generar las tablas y todos los scripts necesarios para poder trabajar correctamente.

Cuando se instala el ODAC, al final nos indica la ruta donde se encuentran los script para ejecutarlos en nuestra base de datos, que normalmente es:

[INSTALL_PATH]\product\11.2.0\client_1\ASP.NET\SQL

En esta carpeta tenemos todos los scripts para instalar los proveedores de forma independiente así como también instalarlos todos, que es lo que mostrare en el ejemplo.

Para ello vamos a nuestro proyecto y dentro de herramientas vamos a usar la opción Ejecutar Script de SQL*Plus
Fig. 2 - Ejecutar SQL Plus
Con esto nos va a pedir la ruta donde están los scripts, así como la conexión a la base de datos donde se ejecutaran.

Fig. 3 - SQL Plus
Si aun no existe ninguna conexión, tenemos la opción de crear una nueva conexión, en la siguiente figura, donde nos mostrara las conexiones que tenemos registradas en nuestro archivo tsnames.ora del Oracle, de las cuales seleccionaremos una y le ingresamos el usuario y clave para hacer la conexión, probamos y le asignamos un nombre.
Fig. 4 - Nueva conexión

Realizado este paso, nos regresará a la figura N° 3. y en "Examinar" le asignaremos la ruta de los scripts, en este caso para crear todas las tablas y scripts usaremos el archivo "InstallAllOracleASPNETProviders.sql".
Fig. 5 - Seleccionar script

Luego ejecutamos el script y con esto ya tenemos creadas todas las tablas y script necesarios con lo que ya podemos empezar a trabajar.

Para poder hacer uso de la tablas que acabamos de crear, solo necesitamos crear una conexión a la base de datos en nuestro web.config con el nombre OraAspNetConString

Fig. 6 - Cadena de conexión
Le agregamos el tag para eliminar la definición existente de la cadena de conexión en nuestro machine.config.

Para probar todo vamos nuevamente a la herramienta de configuración de ASP .NET y podemos configurar la seguridad, roles y usuarios como se muestra en los artículos mencionados inicialmente.
Fig. 7 - Configuración Seguridad ASP .NET
Con esto ya tenemos todo listo para trabajar en nuestra aplicación con los controles de login, espero les sea de utilidad, nos leemos el año que viene :).

19/10/2011

Actualizar controles fuera de un UpdatePanel

Nuevamente retomando el blog que últimamente ha estado un poquito de lado, pero a ver si ahora mantenemos la constancia en los posts.

Ahora voy a comentarles sobre algo que es muy común cuando desarrollamos aplicaciones web y trabajamos con controles UpdatePanel, que es tener que actualizar otros controles que se encuentran definidos fuera del UpdatePanel y para lograrlo vamos a plantear un escenario y las formas de hacerlo.

Escenario:

Tenemos algo muy simple, un UpdatePanel con un TextBox y un Button asociado a un evento que enviará el texto a un Label que está fuera del UpdatePanel

protected void btnActualizar_Click(object sender, EventArgs e)
        {
            this.lblMostrar.Text = this.txtEntrada.Text;
        }

Si tal y como está hacemos clic en el botón no pasará nada con el Label, así que para actualizarlo, les mostraré 2 formas de hacer:

Modo 1: Usando ScriptManager.RegisterDataItem

Para lograr esto tenemos vamos a hacer uso del  PageRequestManager  que obtendrá los datos para ponerlos en el Label y tambien con el RegisterDataItem que los enviará como se muestra en el código.


Y también en el evento del botón ponemos esto:

protected void btnActualizar_Click(object sender, EventArgs e)
        {
            scmPrincipal.RegisterDataItem(this.txtEntrada, this.txtEntrada.Text);
        }

Con esto ya podremos actualizar el Label fuera del UpdatePanel cuando presionemos el botón, pero también podemos hacerlo de otra forma, que detallo a continuación.

Modo 2: Usando otro UpdatePanel

Para esto necesitamos cambiar la estructura y poner el Label dentro de otro UpdatePanel pero con la propiedad UpdateMode="Conditional" para actualizarlo desde el botón.

Y en el evento del botón tendríamos lo siguiente:

protected void btnActualizar_Click(object sender, EventArgs e)
        {
            this.lblMostrar.Text = this.txtEntrada.Text;
            this.upnActualizar.Update();
        }

Conclusión

De ambas formas obtendremos la misma funcionalidad, pero ya depende de cada uno como lo usa, dependiendo la estructura de sus formularios y casos.

Espero les sirva de algo y bueno con esto voy retomando el blog, espero ir poniendo mas cosas.

24/04/2010

Cuidado con las actualizaciones VS2008, VS2010, Office 2010 y sus dependencias.

Ahora con el lanzamiento de Visual Studio 2010 RTM y Office 2010 RTM, toca siempre actualizarse, en el caso de VS2010, instale junto a VS2008 que ya tenia, debido a que pueden trabajar lado a lado sin problema alguno aparentemente y en caso del Office pues me toco sacar el Office 2007 que tenia y dejarlo únicamente con el 2010, aunque se pueden instalar office 2007 y office 200 juntos, en mi caso no era necesario.

Hasta este punto todo bien, pero cuando voy a trabajar con VS2008 al abrir un archivo .ASPX, se bloquea todo el VS2008 y no reacciona ante nada, solo terminando el proceso aunque funciona normal en archivos de código y pues así empezó la búsqueda del problema y una posible solución.

En principio pensé que era problema del VS2010 ya que según el problema estaba reportado en connect lo cual me llevo a un post de scottgu donde indica que se podría tratar de componentes que funcionan en una versión y pues en la siguiente no va, así que para solucionar esto la solución era correr VS2008 en modo seguro (devenv /safemode), de cierta manera esto me funcionó aunque media hora después volvimos a lo mismo, así que buscar otra alternativa, en mi caso ya que puedes tener el mismo problema y esto le daría solución.

Siguiendo con la búsqueda cambie de orientación para ver problemas con office ya que era algo que recientemente había instalado también, y pues se vi la luz.

El problema que tenia radicaba en la actualización de office, el VS2008 se bloqueaba debido a que usaba componentes de office2007 y pues no los encontraba.

Ahora la solución estaba a la vista, en este punto puedes volver al office 2007 nuevamente, pero como office 2010 esta bien chévere, puedes reparar el Componente Web de Autorización de Visual Studio, esto lo encontramos es:

C:\Program Files (x86)\Common Files\microsoft shared\OFFICE12\Office Setup Controller

Ejecutamos el archivo SETUP.EXE (requiere permisos de administrador) y le damos reparar:

image

Esperamos que termines y pues ya tenemos VS2008 de vuelta, si les pasa puede ser debido a esto o como menciono anteriormente, los componentes no compatibles, también hay un hotfix para problemas similares, cualquiera de estos te puede ser de ayuda.

Saludos!

18/04/2010

AjaxControlToolkit CalendarExtender y Problemas con los estilos

Hace algún tiempo que no escribía y pues ahora estuve trabajando en un proyecto y me tope con un problema un poco extraño en el control CalendarExtender del AjaxControlToolkit 3.5, pasaba que al agregarlo no me mostraba todos los días, únicamente me mostraba 5 días como muestro en la imagen:

image

Pensé que podía ser problema del control, pero al probarlo en otro proyecto no me daba este problema, indagando descubrí que esto se debe a las hojas de estilo que usa este control internamente y pues los estilos que tengo en mi aplicación sobrescribían los originales del control y le daban este comportamiento.

El estilo que usa el control es el siguiente:

#container table{
//...
}



Así que si tienen en su aplicación hojas de estilo que usen este identificador deben cambiarle de nombre para no afectar los estilos del calendario o en todo caso agregarle estilo propio al control para que pueda usarlo, de esta manera:


.calendario .ajax__calendar_container{
width:250px;
}
.calendario .ajax__calendar_body {
width:250px;
}


y en el calendario asignarle esta clase


<ajax:CalendarExtender ID="TextBox_CalendarExtender" runat="server" Enabled="True"


 TargetControlID="TextBox" CssClass="calendario"></ajax:CalendarExtender>


De esta manera logro que se visualice la parte restante de mi calendario, pero si desean pueden personalizar todos los estilos del calendario para cambiar la forma en que se ve, les dejo las clases para que puedan personalizarlo a su gusto:


.calendario .ajax__calendar_header {  }
.calendario .ajax__calendar_title { }
.calendario .ajax__calendar_dayname { }
.calendario .ajax__calendar_day { }
.calendario .ajax__calendar_hover .ajax__calendar_day { }
.calendario .ajax__calendar_hover .ajax__calendar_month { }
.calendario .ajax__calendar_hover .ajax__calendar_year { }
.calendario .ajax__calendar_active { }
.calendario .ajax__calendar_today { }
.calendario .ajax__calendar_other .ajax__calendar_day { }
.calendario .ajax__calendar_hover .ajax__calendar_today { }
.calendario .ajax__calendar_hover .ajax__calendar_title { }



Espero les sea de utilidad, hasta el nuevo post.

21/01/2010

Reportes Jerárquicos en Crystal Reports 2008

Nuevamente por acá compartiendo algo que me resulto muy útil a la hora de crear reportes de este tipo, suele pasar muchas veces que tenemos organizados nuestros datos de forma jerárquica, como por ejemplo la estructura organizacional de una empresa.

La forma de crear este tipo de reportes es muy sencilla, voy a mostrar un ejemplo con la siguiente tabla de datos:

Tabla

Como se puede apreciar tenemos la columna EstructuraID que vendría a ser la llave del registro y la columna PEstructuraID que vendría a ser la llave del registro padre del cual depende ese registro, los que tiene valores NULL serán los registros raíz o padres.

Ahora crearemos un reporte que trabaje con esta tabla y lo agrupamos por EstructuraID como se muestra en la imagen

image

Al finalizar nuestro reporte nos quedará similar a esto

image

Hasta aquí no se ha hecho nada en especial, mas que crear un simple reporte agrupado, ahora procederemos a darle una estructura jerárquica, con una opción que viene en Crystal en el menú Informe->Opciones de agrupamiento Jerárquico:

image

Al seleccionar esta opción se nos pedirá que indiquemos la columna que contiene la llave del registro padre y la sangría a aplicar para los subniveles:

image

Y con esto automáticamente tendremos un reporte con estructura jerárquica como lo deseamos, ya ahí se podrán hacer los ajustes de diseño respectivos para que quede como quieran mostrar.

image

Espero les sirva este aporte, por cierto también funciona en Crystal XI.

Saludos! 

29/09/2009

Editor de Texto en ASP .NET MVC

Cuando se desarrolla una aplicación que va a contender secciones donde se necesita ingresar texto con formato, siempre es muy útil un editor de texto que nos permita esto, estos se usan en diversos tipos de aplicaciones, en esta oportunidad les mostraré como usar el CKEditor con ASP .NET MVC.

Lo primero que hay que hacer es descargarse las librerías, descomprimirlo y copiarlo en el directorio /Content/js/ luego agregar la referencia al archivo ckeditor.js en la vista donde se va a usar o en la masterpage si se desea para toda la aplicación, seria algo similar a esto

<script src="../../Content/js/ckeditor/ckeditor.js" type="text/javascript" ></script>

Con esto ya tenemos la referencia al script a usar, ahora para ponerlo a funcionar agregamos lo siguiente


 

<%= Html.TextArea("Descripcion", "", new { @name = "Descripcion" })%>
<script type="text/javascript">
//<![CDATA[

// This call can be placed at any point after the
// <textarea>, or inside a <head><script> in a
// window.onload event handler.

// Replace the <textarea id="editor"> with an CKEditor
// instance, using default configurations.
CKEDITOR.replace("Descripcion");

//]]>
</script>
 
Con esto podemos logra algo así
ckeditor
 

Este editor tiene muchas opciones, como mostrar solo algunos comandos, skins, entre otros, los invito a revisarlo, esta muy bueno