domingo, 19 de noviembre de 2017

Corrigiendo el error de ASP.NET MVC 5 y Sql Injector con individual User Account en el AccountController

En este post vamos a aprender a solucionar un problema de Simple Injector cuando lo instalamos con una aplicación de ASP.NET MVC 5 con la opción de Individual User Accounts activada. Este error lo podemos solucionar en un minuto.

viernes, 14 de abril de 2017

Introducción al Ruteo o Routing



El Ruteo es la parte de ASP.NET que nos permite realizar una relación entre las URL's y los distintos recursos que contiene tu proyecto. Por tanto, utilizando ruteo es que podemos definir hacia qué acción de qué controlador es que debemos dirigir una petición HTTP.

Tenemos dos opciones para manejar el ruteo: Ruteo tradicional y ruteo por atributo. En este post nos concentraremos en el ruteo tradicional.

Antes, lo que se hacía era servir archivos de tu servidor web (típicamente archivos HTML, o ASPX en web Forms), esto era una desventaja pues, si cambiabas el nombre de un ASPX, potencialmente se podían romper varios links. El ruteo es diferente, porque en vez de que la URL apunte a un archivo físico de tu escritorio, simplemente son URL's las cuales, mediante reglas de ruteo, podemos definir hacia donde van.

Imagina las reglas de ruteo como una interfaz entre el usuario y tus controladores, de modo que las reglas de ruteo definen hacia donde va tal o cual petición HTTP.

sábado, 14 de mayo de 2016

ASP.NET MVC: Mostrar descripción de ENUM en EnumDropDownListFor

Si tienes un enum, y quieres que en el UI de ASP.NET MVC 5 se muestre una descripción amigable de los valores del enum, simplemente utiliza [Display(Name="valor")], así:

 public enum TipoPrestamo
    {  
  [Display(Name = "Opción uno")]
        OpcionUno= 1,
        [Display(Name = "Opción dos")]
        OpcionDos= 2,
        [Display(Name = "Opción tres")]
        OpcionTres = 3
    }

Ahora, cuando uses EnumDropDownListFor, va a salir el texto del Display, el cual puede ser tan amigable como desees.

jueves, 28 de enero de 2016

Ref vs Out en C#

Para entender qué hacen ref y out, es bueno recordar que las variables de tipos de referencia guardan un puntero a un objeto en memoria y no el valor en sí. Entonces, cuando "modificamos la variable", lo que hacemos es ir hacia donde el puntero nos indica, y editar el objeto. Podemos tener dos variables de tipos de referencia que apuntan hacia el mismo objeto. Una manera de visualizar esto es con un ejemplo.

Una clase es un tipo de referencia, y un struct es un tipo de valor. Si pasamos una clase como parámetro a un objeto, lo que estamos pasando es una referencia a un objeto, y no el objeto en sí, por lo que si modificamos la clase en el método que invocamos, entonces el objeto original se verá afectado; esto es totalmente opuesto a lo que ocurre con un tipo de valor. Veamos un ejemplo:


Como puedes ver, la variable de tipo PersonaClass (tipo de referencia) queda modificada en el método Main tras haber sido modificada en un método externo; en cambio, la variable de tipo PersonaStruct (tipo de valor) no queda modificada en el método Main. Esto es, porque los tipos de valor pasan el valor directamente al método (crean uno nuevo), mientras que el tipo de referencia pasa una referencia al objeto original.

Con ref y out puedes lograr el mismo efecto de los tipos de referencia en los tipos de valores, esto es, que cuando un tipo de valor lo pases como parámetro a un método y lo modifiques en dicho método, la variable original quedará modificada.

Antes de dar el ejemplo, damos la diferencia entre ref y out. Aunque ambos hacen lo mismo en términos de comportamiento, la diferencia radica en que los parámetros marcados como out deben ser asignados en el método que modifica de manera obligatoria, esto es porque se asume que el parámetro no ha sido inicializado, ref no tiene esta atadura. Ejemplo:


jueves, 21 de enero de 2016

Hacer Trim a todos los strings de un objeto en C#

Para hacer Trim a todas las propiedades de un objeto podemos usar GetProperties e iterar las propiedades del objeto. Utilicé un Extension Method para esto:


De ese modo, podemos utilizar dicha funcionalidad así: objeto.TrimAll();

jueves, 31 de diciembre de 2015

Selectores en jQuery

La librería jQuery nos permite hacer uso de selectores bastantes flexibles con los cuales podemos seleccionar los elementos del documento HTML que queramos.

En este post veremos algunos de ellos.

Primero los coloco todos a modo de resumen, y más abajo los vemos en detalle con ejemplos:


Descripción del Selector
Símbolo
Ejemplo
Selecciona por ID
#
$(“#IdDelElemento”)
Selecciona por clase
.
$(“.clase”)
Selecciona por elemento
(no tiene)
$(“element”)
Selecciona por atributo
Ver siguiente tabla
Ver siguiente tabla
Selector universal
*
$(“*”)

Resulta que tenemos varios sabores a la hora de escoger la selección por atributo, estos los resumimos en la siguiente tabla:

Descripción del Selector
Símbolo
Ejemplo
Selecciona por valor
[atributo=valor]
$(“[name=botonEnviar]”)
Selecciona si el valor del atributo empieza por el valor dado
[atributo^=valor]
$(“[class^=alert]”)
Selecciona si el valor del atributo termina por el valor dado
[atributo$=valor]
$(“[class$=danger]”)
Selecciona si el valor del atributo contiene el valor dado
[atributo*=valor]
$(“[name*=fecha]”)
Selecciona si el atributo está presente en el elemento
[atributo]
$(“[att1]”)

Existen otros, pero entiendo estos son los principales. A continuación veremos cada uno por separado. Colocaré jsFiddle's para que se vea el ejemplo en ejecución.

lunes, 10 de marzo de 2014

Introducción a las transacciones en SQL Server

Escribes código. Lo pruebas. Funciona. Lo pones en producción. ¿Y qué pasa? Falla y ahora tienes datos sucios en la base de datos. Cuando hablamos de datos sucios nos referimos a datos probablemente incompletos o, quizás, carentes de sentido.

Quizás tienes un procedimiento almacenado (Stored Procedure) que realiza cambios (insertar, actualizar, borrar) en una o varias tablas consecutivamente, donde una operación depende de la anterior, o al menos, le da sentido. Por ejemplo: si en la base de datos de una tienda tienes una tabla para la cabecera de las facturas (datos generales: nombre del cliente, fecha de la compra, sucursal, etc.) y otra tabla para el detalle de la factura (el listado de artículos que se compró en dicha orden), es evidente que no tiene sentido un registro de cabecera que no tenga sus correspondientes registros de detalle.

Supongamos que surge un problema cuando insertamos los datos de los artículos en la tabla de detalles. Supongamos que de 3 artículos en la tabla de detalles, solo se insertaron dos, hubo un error con el tercero. Por eso, tenemos ahora datos incoherentes. Probablemente la factura dice un total de la orden pero la sumatoria de los precios de los artículos no da como resultado dicho total.

Para prevenir estos casos usaremos transacciones.