February 8, 2016

No Comments

Detectar campo faltante cuando Model State IsValid es false

 

Cuando se desarrolla en MVC tenemos el Modelo, Vista y el Controlador este último se encarga de toda lógica que se envía directo a la vista.

En algunas ocasiones necesitamos actualizar ciertos campos dentro de alguna tabla de nuestra base de datos y nos encontramos con ciertos problemas en los cuales se ve involucrado el ModelState

Como lo veremos en el siguiente ejemplo:

Aquí tenemos el Model del ejemplo:

 

Donde se puede observar que la columna FileName es Requerida

public class Document

{

public int Id { get; set; }

 

[Required(ErrorMessageResourceType = typeof(DocumentResource),

ErrorMessageResourceName = “FileNameError”)]

[Display(Name = “FileName”, ResourceType = typeof(DocumentResource))]

public string FileName { get; set; }

 

public DateTime DateCreated { get; set; }

 

public string CreatedBy { get; set; }

 

}

 

Aqui tenemos el Controller.

public ActionResult Create([Bind(Include = “FileName,DateCreated,CreatedBy”)] Document document)

{

if (ModelState.IsValid)

{

document.DateCreated = DateTime.Now;

document.CreatedBy = “juan perez”;

 

db.Documents.Add(document);

db.SaveChanges();

return RedirectToAction(“Index”);

}

 

return View(document);

}

En este método tenemos que recibe los campos de Id, Name, UserId, DateCreated y CreatedBy

El problema viene aquí en la vista cuando consume el controller de Create. Y está esperando recibir todas las columnas que sean requeridas y si hace falta alguna y el ModelState será False (Para este ejemplo no se está enviando la columna FileName que es requerida)

 

Si deseamos saber el por qué el Model State es False tan solo debemos colocar la siguiente consulta y nos detallara el problema por el cual el ModelState es false.

     var errors = ModelState.Where(x => x.Value.Errors.Count > 0)

              .Select(x => new { x.Key, x.Value.Errors })

              .ToArray();

 

Aquí podemos ver con la consulta el campo que ocasiona la excepción por la cual el ModelState es False

 

Y aquí el detalle con el campo.

July 15, 2015

No Comments

¿Que son las directivas de compilación condicional?

 

Con esta funcionalidad podemos determinar cómo se comportará el compilador con el código que acabamos de generar, para así tomar diferentes rutas de compilación.

 

En ocasiones requerimos que nuestro sistema tenga un comportamiento en ambiente de desarrollo y otro comportamiento diferente en producción, esto con el objetivo de facilitar la depuración y el mantenimiento en tiempo de desarrollo y es por eso que existen las directivas de compilación condicional.

 

Estas consisten en una serie de constantes que proveen la infraestructura para diferenciar si estamos compilando en modo DEBUG y RELEASE.

 

En el código la forma de representarlo es mediante 2 constantes predefinidas las cuales son:

 

  • DEBUG: Esta constante nos indica que estamos compilando nuestro código en modo Debug.
  • RELEASE: Esta constante nos indica que estamos compilando nuestro código en modo Release.

 

La manera de utilizar estas directivas para ejecutar o no ejecutar código dependiendo si estamos en tiempo de desarrollo, es la siguiente:

 

public bool DebugMethod()

{

#if DEBUG

    return true;

#else

    return false;

}

 

Este método verifica si estamos compilando en modo DEBUG y si es así nos regresa un true.

Algunas de las ventajas que tenemos al utilizar esta funcionalidad son:

 

  • Código centralizado
  • No se repite el código
  • El mantenimiento es más eficiente
  • Ahorro en tiempo de programación
  • Útil para desarrollos que tengan acceso restringido a los módulos

 

July 15, 2015

No Comments

¿Cómo usar los métodos de forma asíncrona?

 

Tras la versión del Framework 4.0 se mejoraron muchas de las características en las librerías una de ellas es la ejecución de los procesos asíncronos más simplificados, antes de esta versión para poder utilizar un proceso de manera asíncrona como por ejemplo estar ejecutando un método que invoca un servicio se daba el uso de los delegados en cuanto sl uso de los controles se utiliza de this invoke para realizar la comunicación con los controles de ASP.

En la versión 4.0 se agregó una característica más simple que tiene por nombre la librería Task Parallel Library que contiene la clase Task para el manejo de los objetos que suelen ser llamados de manera asíncrona.

 

Características

  • ASYNC, se utiliza en aquellos métodos que van a realizar acciones de manera asíncrona , es uno de los requisitos para un método que va llevar a cabo una acción asíncrona
  • AWAIT , esta es la instrucción que se da para que se realice una acción de manera asíncrona, no se bloquean las demás acciones solo se ejecutaran una vez que se termine con la tarea asignada.
  • CANCELLATION TOKEN, este realiza la cancelación de la tarea.
  • WHENALL, se utiliza para esperar a las tareas asíncronas teniendo como valor de regreso un array de tipo anónimo T
  • WHENANY, este permitiendo tener la primera tarea que se encuentre disponible teniendo una serie de tareas por ejecutar este regresara un valor de tipo TASK.

 

var whenAnyEjemplo = await Task.WhenAny();

 

  • FROMRESULT, regresa un objeto TASK teniendo como parámetro un anonimo T
  • DELAY, utilizado para asignar retrasos o pausa en los métodos asíncronos
  • YIELD, procesa otros mensajes

     

Ejemplo

Este es un ejemplo de método asíncrono con el evento Click de un botón

protected
async
void btnAsincrono_Click(object sender, EventArgs e)

{


var cancel =
new
CancellationTokenSource();


var task =
new
List<Task<string>> {


Task<string>.Run( delegate {


return Simple();}),


Task<string>.Factory.StartNew(() => GetText.GetBuilder(cancel.Token),cancel.Token),


Task<string>.Factory.StartNew(() => GetText.GetConcat(cancel.Token),cancel.Token)

};

 


try

{


string a =
await
await
Task.WhenAny(tasks);

}


catch (Exception)

{

 


throw;

}

}

July 15, 2015

No Comments

Que son los métodos de extensión (C#)

 

Dentro de la programación nos encontramos muchas veces con reglas en el negocio que se aplican casi todo el tiempo por ejemplo la suma del IVA en distintas partes del código se puede estar utilizando esta regla, se tienen dos formas de atacar este ejercicio uno es el crear un método que reciba el numero en el cual queramos aplicarle el IVA y que este método sea heredado o sea aplicado en cada página las veces que sean necesarias o crear una extensión que reciba un valor de la misma manera como lo veremos a continuación

 

Lo que vamos a hacer es añadir un metodo nuevo en este caso uno que nos calcule cuales el IVA que se va aplicar. Los metodos de extencion tienen el mismo aspecto que los metodos que son estaticos aun que tienen la diferencia que el primer parametro debe de llevar la palabra this.

 

public
static
class
Extensores

{


public
static
double CalculaIVA(this
double monto)

{


return monto *
16;

}

}

 

El método se trata de un método que es estático y está dentro de una clase que se llama extensores una de las reglas para que funcione la extensión es que el método sea static

Para llamar el método de CalcularIVA se puede llamar desde cualquier parte del código sin tener que heredar la clase Extensores aquí el ejemplo:

 

 

Podemos notar que al crear una variable del tipo doublé y asignarle un valor el Intellinsense nos muestra las acciones que se pueden realizar con ese tipo de objeto y entre una de esas se encuentra el método que nosotros acabamos de extenderle a ese tipo doublé

 

Ventajas

  • Se pueden generar extensiones sobre una interfaz donde todas las clases que estén heredando de esa clase o implementen la interfaz tendrán el método de la extensión
  • Los métodos de la extensión también pueden ser genéricos.

July 15, 2015

No Comments

Interfaces Implícitas y Explicitas

 

La interfaces es una manera de construir un tipo de contrato entre las clases que tenemos dentro de nuestro proyecto, pero tenemos que tener en cuenta que para poder realizar ese tipo de contrato tenemos que implementar los distintos métodos que sabemos que ya están definidos en una clase y pueden estar ya disponibles dentro de la interface.

 


 

 

Interfaces Implícitas

Al tener solo una interfaz heredando en una clase es común que se utilice este tipo de implementación ya que es la manera más común de invocar a un método dentro de una clase ejemplo:

public
class
Implicita : IImplicita

{


public
void Metodo()

{


Console.WriteLine(“Esto es la manera implicita”);

}

}

 

Interfaces Explicitas

Al tener más de una interfaz lo más común es la implementación de las interfaces explicitas ¿Que diferencia tiene sobre la implícita?, pues solamente que en la explicita al tener más de dos herencias se está definiendo de donde se está utilizando dichos métodos como lo vemos a continuación

 

public
class
Explicita : IExplicita , IExplicita2

{


void IExplicita.MiMetodo()

{


Console.WriteLine(“Hola esto e sla interface 1″);

}

 


void IExplicita2.MiMetodo()

{


Console.WriteLine(“Hola esto es la interface 2″);

}

 

}

 

Para ser utilizado dentro de una página por ejemplo se invocaría de esta manera

Explicita e =
new
Explicita();

((IExplicita)e).MiMetodo();

 


 

July 15, 2015

No Comments

Expresiones Lambda

 

Las Expresiones Lambda aportan una sintaxis más concisa y funcional para escribir métodos anónimos.

Un método anónimo es una instrucción o expresión insertada que puede utilizarse en cualquier lugar donde se espere un tipo delegado. Puede utilizarla para inicializar un delegado con nombre o pasarla en lugar de un tipo delegado con nombre como un parámetro de método.

Es por eso que son las más utilizadas para escribir peticiones LINQ y para optimización de código ya que permiten una forma muy compacta de escribir funciones que puedan ser pasadas como argumentos para un tratamiento posterior.

El siguiente ejemplo es una expresión lambda de manera sencilla:

X=> x+1

En donde podemos observar que tenemos un argumento “x” que retorna un valor “x+1“.

Los métodos anónimos permiten omitir la lista de parámetros, esto significa que los métodos anónimos pueden convertirse en delegados con diversas firmas.

A continuación se muestra una expresión Lambda para especificar un filtro, en este caso del nombre de una persona y poder identificarla:


 

List<Persona> personas = new List<Persona> (

{

new Persona {Nombre = “Angel”, Apellido =”Valdez”}

new Persona {Nombre =”Carlos”, Apellido =”Chavez”}

new Persona {Nombre = “Eduardo”, Apellido = “Sanchez”}

new Persona {Nombre = “Giovanni”, Apellido = “Torres”}

}

);

Persona persona1 = personas.Where (p=>p.nombre == “Angel”);

 

En el ejemplo:

 

personas.Where (p=>p.Nombre == “Angel”);

Es la expresión Lambda, y la función que realiza es verificar que la clase que queremos obtener sea la que en su atributo “Nombre” sea igual a “Angel”.

p

Es el argumento de la función.

Las expresiones lambda infieren el tipo de dato automáticamente de la firma de la función padre, en este caso el WHERE requiere un argumento de tipo “Persona”, con lo cual p es de tipo “Persona”.

 

=>

Este operador indica que estamos utilizando una expresión Lambda, posicionando los argumentos del lado izquierdo del operador y las instrucciones de la función del lado derecho.

 

Personas.Where

Es el cuerpo de la función que devuelve la clase que cumpla la condición.

 

Como podemos observar las expresiones Lambda nos permiten abreviar el método en el mismo lugar que se usará, esto nos ahorra tiempo, espacio y optimiza nuestro código de tal manera que sea entendible y eficiente.

 

 

 

June 8, 2015

No Comments

Procesos paralelos c#

 

En ocasiones al desarrollar una aplicación nos enfrentamos a situaciones en las cuales debemos ejecutar procesos de forma simultánea y es un problema debido a que los procesos se vuelven lentos y el tiempo de respuesta para el usuario es elevado.

Por ejemplo, si estamos desarrollando una aplicación online de una farmacia que tiene 3 sucursales, la cual vamos a utilizar para saber si algún medicamento está disponible y en cuál de las sucursales lo podemos encontrar, nuestro sistema tendría que buscar en cada una de las farmacias la misma información y regresarla, lo cual haría el sistema bastante lento y no sería eficiente para la operación.

Este tipo de problemas lo podemos resolver utilizando el paralelismo, que significa que vamos a ejecutar los llamados al mismo tiempo pudiendo obtener la información necesaria de cada una de las sucursales.

Vamos a realizar un pequeño ejemplo de cómo es que funciona y como es que podemos implementarlo en nuestra aplicación.

 

Ejemplo:

 

  1. Obtenemos información de la Farmacia 1 y así por cada una de las 3

 

private void Farmacia1()

{

      Thread.Sleep(1000);

      MessageBox.Show(“Farmacia 1″);

}

 

  1. Asignamos al método Farmacia1 como una tarea

 

Task t = new Task(this.Farmacia1);

t.Start();

 

Y realizamos este proceso con cada una de las 3 sucursales que son parte de la Farmacia

 

  1. Por último sincronizamos la ejecución de las tareas

 

Task t = new Task(this.Farmacia1);

t.Start();

 

Task t2 = new Task(this.Farmacia2);

t2.Start();

 

Task t3 = new Task(this.Farmacia3);

t3.Start();

 

Task.WaitAll(new Task[] { t, t2, t3 });

 

Con esta estructura podemos implementar diferentes instrucciones para cada una de las farmacias de una manera rápida y eficiente.

June 8, 2015

No Comments

Tipos dinámicos c#

 

El tipo dynamic permite la comunicación o post de una variable y que se omita la comprobación de tipo en tiempo de compilación. En su lugar, se resuelven estas operaciones en tiempo de ejecución, de la siguiente manera:

 

El tipo dynamic se comporta como el tipo object en la mayoría de las circunstancias, ya que el compilador no resuelve o no comprueba el tipo de las operaciones que contienen expresiones de tipo dynamic.

 

El compilador empaqueta información sobre la operación y esa información se utiliza después para evaluar la operación en tiempo de ejecución. Como parte del proceso, las variables de tipo dynamic están compiladas en las variables de tipo object. Por lo que el tipo dynamic sólo existe en tiempo de compilación, no en tiempo de ejecución.

 

Ejemplo:

 

dynamic d = 1;

var suma = d + 3;

System.Console.WriteLine(suma);

 

 

La ventaja principal de este tipo de dato es que no tenemos que preocuparnos si el objeto obtiene su valor de una API de COM, de un lenguaje dinámico, de DOM (Document Object Model) HTML, de la reflexión o de cualquier otra parte del programa.

 

A continuación podemos ver con el siguiente ejemplo la diferencia entre el tipo de dato obj y el tipo de dato Dynamic

 

Public class Program

{

static void Main(string[] args)

{

dynamic dyn = 1;

object obj = 1;

 

System.Console.WriteLine(dyn.GetType());

System.Console.WriteLine(obj.GetType());

}

}

 

Las instrucciones WriteLine muestran los tipos en tiempo de ejecución de dyn y obj. En ese punto, ambos tienen el mismo tipo, entero. Se produce el siguiente resultado:

 

System.Int32

System.Int32

 

Posteriormente asignamos un nuevo valor a las variables aumentándoles un 2, de la siguiente manera:

 

dyn = dyn + 2;

obj = obj + 2;

 

A continuación el sistema nos muestra un error del compilador que notifica un intento de suma de un entero y un objeto en la expresión obj + 2.

 

Sin embargo, no se notifica ningún error para dyn + 2. En tiempo de compilación no se comprueba la expresión que contiene dyn porque el tipo de dyn es dynamic.

May 22, 2015

No Comments

QUE ES SDL?

También conocido como Lenguaje Declarativo Simple por sus siglas en inglés (Simple Declarative Language.) Facilita la descripción de mapas, listas y árboles de datos de una manera sencilla de leer. Permite acceder a todas la estructura de los datos de la clase con una serializacion simple. El SDL es una alternativa al XML este tipo de serializacion la podemos encontrar en lenguajes como Java o C#.

Características

  • Es una estructura que facilita el manejo en archivos de configuración
  • Tiene un manejo de estructura básico
  • Es una estructura que es utilizado en los sistemas de desarrollo como .NET y Eclipse

SDL ha sido adoptado en los últimos 5 años por organizaciones que incluyen Oracle y Bank que han participado también como colaboradores analizando y agregando bibliotecas a otros idiomas, también incluyendo Ruby y C++, SDL se encuentra en su actualizacion1.1 para Java que incluye mejoras en los espacios de nombres y una API mejorada. La versión de .NET 2.2 que ya está incluida en Visual Studio 2012

Un ejemplo de este tipo de estructura:


				people location="Tokyo" {

person “Akiko” friendly=true {

hobbies {

hobby “hiking” times_per_week=2

hobby “swimming” times_per_week=1

}

}

Vamos a ver la diferencia ente una estructura XML a SDL

  • XML
01 <Perro Nombre=”Firulais” Altura=”1.5″ Peso=”10″>

 

02     <Correas>

 

03         <Correa Color=”azul” />

 

04         <Correa Color=”Roja” />

 

05     </Correas>

 

06     <Habilidades>

 

07         <Correr velocidad =”10″ />

 

08         <Saltar Altura =”0.5″ />

 

09     </Habilidades>

 

10 </Perro>

  • SDL
1 Perro Nombre=” Firulais “ Altura =1.5 Peso =10 {

 

2     Correas “azul” “roja”

 

3     Habilidades {

 

4         Correr Velocidad=10

 

5         Saltar Altura=0.5

 

6     }

 

7 }

Búsqueda en la dentro de una estructura SDL con C#

Tag root = SDL.read(new File(“/mis documentos/perro.sdl”));

List<Tag> Perro = root.getChild(“Perro”).getChild(0).getChild(“Correas”).getChildren();