Archivo por meses: febrero 2014

Crear un botón de ASP NET con Glyphicon

Si con Bootstrap queremos utilizar un botón que tenga un icono de Glyphicon tenemos que olvidarnos del clásico asp:button y utilizar asp:linkbutton de la siguiente manera:


<asp:LinkButton runat="server" Text="<span class='glyphicon glyphicon-remove'></span>" CssClass="btn btn-default btn-xs" />

Lo que hacemos es darle una clase al linkbutton de Boostrap y dentro del text (innerhtml) la etiqueta span y su contenido.

No olvides que debes de tener los ficheros de css necesarios para que esto funcione, o sea bootstrap.css o bootstrap.min.css.

Modelo y Base de Datos con Identity en ASP NET

Con la versión 4.5 de .NET Framework se ha incorporado la autenticación basada en Identity. Esto ya lo hablamos en pasadas entradas, ahora vamos a verlo un poquito más a fondo.

Con Identity se crean las siguientes tablas:

  • AspNetRoles
  • AspNetUserClaims
  • AspNetUserLogins
  • AspNetUserRoles
  • AspNetUsers

En estas tablas se guarda toda la información relacionada con los usuarios. Es en la tabla AspNetUsersr donde  se guardan los siguientes campos:

  • Id
  • UserName
  • PasswordHash
  • SecurityStamp
  • Discriminator

En la siguiente imagen se muestra la estructura de tablas y los campos de la tabla AspNetUsers:

Tablas con Identity en ASP.NET 4.5

Ya entrando en el código, si has generado el proyecto web con una de las plantillas que ofrece Visual Studio 2013 verás que en la carpeta «Models» se ha creado un archivo llamado «IdentityModels.cs». En este fichero existen varias clases que definen la funcionalidad de Identity en la aplicación. Las clases son:

  • ApplicationUser. Es la entidad Usuario de aplicación. Hereda de «IdentityUser» e inicialmente está vacía aunque podemos meterle las propiedades que deseemos para personalizar nuestro modelo de usuario (http://go.microsoft.com/fwlink/?LinkID=317594). Si nos fijamos en la clase de la que hereda contiene las siguientes propiedades que se mapean a la base de datos: Id, PasswordHash, SecurityStamp, UserName así como las colecciones que relacionan con las demás tablas.

Clase IdentityUser

  • ApplicationDbContext. Es la clase que maneja el contexto Entity Framework con la base de datos. De hecho en su constructor coge el connectionstring del web.config para su conexión con la base de datos en este caso «DefaultConnection».

Clase ApplicationDbContext

  • UserManager. Es una clase que gestiona operaciones típicas de usuarios con la base de datos. Hereda de «UserStore» y tiene diversos métodos de creación y borrado de usuarios, adicción y eliminación de roles por usuario, búsqueda por nombre o id y muchos más. También tiene gran parte de estos métodos en su modalidad asíncrona. Sin embargo desde aquí no es posible obtener todos los usuarios.
  • IdentityHelper. Esta clase estática situada fuera del espacio de nombres «Models»se encarga de sincronizar la base de datos en los registros de usuarios con el comportamiento de la aplicación en lo que se refiere a la autenticación. Cada vez que un registro de un usuario se efectúa correctamente pasará por IdentityHelper para insertarlo en la base de datos y posteriormente autenticarlo en la aplicación.

Después de analizar todo este rollo vamos a ver como podríamos obtener todos los usuarios con Identity. Si utilizamos directamente el contexto «ApplicationDbContext» accederemos a todos los usuarios mediante su propiedad «Users»:


IList<ApplicationUser> users = context.Users.ToList();

Unobtrusive validation en ASP NET 4.5

Unobstrusive validation (algo así como validación no obstrusiva) es una nueva característica introducida en ASP.NET 4.5. En un escenario normal cuando usamos un validador para validar cualquier control en el lado cliente se genera cierto código javascript automáticamente que se encarga de realizar esa funcionalidad.

Con la característica Unobstrusive Validation no se genera este código javascript pero para realizar la validación utiliza los atributos HTML5 data-*.

Cuando se crea un nuevo proyecto web con Visual Studio 2013 esta característica está por defecto habilitada.

Para manejar el valor en el que se establecerá esta característica podremos hacerlo de dos formas:

  • Dentro de <appSettings> en web.config:

Habilitado:

<add key="ValidationSettings:UnobtrusiveValidationMode" value="WebForms"/>

Deshabilitado:

<add key="ValidationSettings:UnobtrusiveValidationMode" value="None"/>
  • En Application_Start dentro del global.asax:
void Application_Start(object sender, EventArgs e)
{
//Habilitar característica Unobtrusive Validation
ValidationSettings.UnobtrusiveValidationMode = UnobtrusiveValidationMode.WebForms;
//Deshabilitar característica Unobtrusive Validation
ValidationSettings.UnobtrusiveValidationMode = UnobtrusiveValidationMode.None;
}

Redirigir url por idioma en htaccess

Si tienes un sitio web en Apache y necesitas redirigir a una dirección url distinta por cada idioma (inglés, español, portugués…) puede ser muy útil hacerlo mediante htaccess con la cabecera HTTP:Accept-Language que transmite el navegador del cliente. De este modo «confiaremos» en la configuración de lenguaje que cada usuario tiene en su navegador.

Así que nos ponemos manos a la obra:

Crear estructura de directorios

Deberemos crear un directorio por cada uno de los idiomas.

Por ejemplo si nuestro dominio es midominio.com crearemos en la raíz tantas subcarpetas como idiomas queramos manejar:

midominio.com/pt

midominio.com/es

midominio.com/en

Editar el archivo .htaccess

Añadiremos estas líneas:


RewriteEngine On
RewriteBase /

# Lenguaje portugués: 'pt'
RewriteCond %{HTTP:Accept-Language} ^pt [NC]
RewriteRule ^/?$ pt/ [R,NC,L]

# Lenguaje portugués: 'es'
RewriteCond %{HTTP:Accept-Language} ^es [NC]
RewriteRule ^/?$ es/ [R,NC,L]

#Regla general para los demás casos
RewriteRule ^/?$ en/ [R,NC,L]

En el código podemos comprobar que se establecen diversas reglas de redireccionamiento para cada condición de la cabecera enviada por el navegador.

Key o clave en Entity Framework Code First

Al crear un proyecto con visual studio 2013 que utilice Entity Framework Code First me asaltó la duda de por qué en el modelo no existía en casi ninguna clase la DataAnnotation [Key] que establece que propiedad será la encargada de guardar la clave de la tabla.

Primero hay que indicar que en Entity Framework es absolutamente necesario que cada entidad contenga una clave primaria. En el caso de que no se establezca ninguna clave el generador de la base de datos dará un error en tiempo de ejecución.

Sin embargo si Entity Framework no encuentra la DataAnnotation [Key] irá a buscar una propiedad de la clase que contenga la palabra «Id» (no es case-sensitive) y la asignará automáticamente.


public class Movie
 {

[Required, StringLength(100), Display(Name = "Name")]
 public string MovieName { get; set; }
 public int Id { get; set; }
 }

En el ejemplo anterior a la hora de generar la tabla Movie, Entity Framework entenderá que la propiedad «Id» será la encargada de ser la clave.

Entity Framework Code First

Entre las muchas sorpresas que Microsoft nos viene dando con .NET 4.5 está el progreso que ha hecho la tecnología de Entity Framework esforzándose para que el desarrollador se olvide cada vez más de SQLServer y se pueda centrar en lo que es puramente su trabajo: programar (que no es poco).

Esta última versión (Entity Framework 6) permite utilizar el paradigma de programación Code First (Primero el código). Es cierto que en anteriores versiones se podía utilizar esta técnica pero puedo asegurar que era bastante más complicado que ahora.

¿En qué consiste code first?

Code First te permite primero crear el modelo de datos como clases para posteriormente migrarlo a un sistema de gestión de base de datos. Las clases que se definen para crear el esquema de datos se llaman Entidades o Entity Classes.

Cada propiedad de una clase le corresponde una columna en una tabla equivalente de la base de datos. A estas entidades también se les pueden añadir métodos y funciones.

Aplicaciones web contra Sitios Web en visual studio

Desde que recuerdo en Visual Studio siempre ha habido dos maneras de crear webs llamadas:

  • Aplicaciones Web
  • Sitios Web

En Visual Studio 2013 sigue existiendo está filosofía pero… ¿en qué se diferencian las aplicaciones web de los sitios web?

Existen ventajas y desventajas en cada una de las dos implementaciones.

En aplicaciones web:

  • Permite utilizar la característica «Editar y continuar» del depurador. Esta característica es un problema en Visual Studio 2010 instalado en Sistemas Operativos de 64 bits ya que no funcionaba correctamente. En Visual Studio 2013 funciona correctamente.
  • Permite ejecutar pruebas unitarias en los codebehind de los aspx.
  • Puedes crear referencias a todos los archivos de código de la aplicación.
  • Es posible crear dependencias de proyecto entre varios proyectos web.
  • El compilador puede crear un ensamblado único para todo el sitio.
  • Puedes controlar la versión y nombre de ensamblado.
  • Es posible evitar situar código fuente en producción.

En sitios web:

  • No es necesario compilar el proyecto para implementarlo.
  • Es posible actualizar los archivos en producción editándolos directamente.
  • No existe un archivo de proyecto (.csproj o .vbproj).
  • La ejecución de una página individual no requiere la compilación correcta de todo el sitio web al completo. (En un proyecto de aplicación Web, no pueden existir errores de compilación en cualquier parte del sitio ya que de esta manera no generaría el ensamblado)

Resumiendo y desde mi punto de vista, los sitios web se utilizan para proyectos simples que no requieren de una gran infraestructura de código ni un gran número de dependencias. En cambio para proyectos de gran envergadura y que necesiten cierta arquitectura (3 capas por ejemplo) es mejor utilizar una implementación de proyecto Web.