Validación de datos de entrada – Play Silverlight

Uno de los aspectos fundamentales en el desarrollo de aplicaciones de negocio es la validación de datos de entrada. Silverlight ofrece tres enfoques con los que afrontar este aspecto que explicaré a continuación.

Validación utilizando Excepciones

Este enfoque, introducido en Silverlight 3 y que hoy en día ha quedado bastante obsoleto, consiste en realizar la validación de los datos de entrada en el setter de la propiedad correspondiente lanzando una excepción si el valor no es válido. Esa excepción será capturada por el sistema de manejo de errores y pasada al VisualStateManager para su tratamiento.

Para poner este sistema en práctica es necesario, por un lado, en el xaml asociar el binding del elemento de entrada a la propiedad correspondiente en el ViewModel el cual, además, deberá tener las siguientes características:

  • Poner la propiedad ValidatesOnExceptions a True.
  • El modo de Binding a TwoWay

Después, ya en la clase ViewModel, en el setter de la propiedad hacer las comprobaciones necesarias y lanzar una excepción si no cumple alguna condición.

private string email;

public string Email
{
     get
     {
          return email;
     }

     set
     {
          email = value;
          NotifyPropertyChanged("Email");

          if (!value.IsValidEmailAddress())
          {
               throw new Exception("Dirección de correo no valida.");
          }
     }
}

El texto pasado como argumento en el lanzamiento de la excepción será el que se muestre en pantalla.

Validación con DataAnnotations

Los DataAnnotations son atributos que se pueden aplicar a clases o propiedades que permiten determinarcómo se presentan los datos, definir relaciones entre entidades y, en tercer lugar, definir reglas de validación. Este último aspecto es en el que nos centraremos, para más información sobre DataAnnotations haced click aquí.

El namespace System.ComponentModel.DataAnnotations contiene una serie de atributos de validación que incluyen comprobación de tipo de dato, pertenencia a un rango o cumplimiento de una expresión regular, entre otros.

También existe la posibilidad de crear nuestros propios atributos de validación. Para ello, tan solo debemos crear una clase que herede de ValidationAttribute y sobreescribir el método IsValid, en cuyo cuerpo deberemos hacer las comprobaciones necesarias.

Con este sistema, para lanzar la validación, se utiliza el método ValidateProperty de la clase estática Validator en el setter de la propiedad a validar. Este método determina si una propiedad tiene un valor válido y lanza una excepción de tipo ValidationException en caso de que no sea así. El resultado será el mismo que con el enfoque anterior.

El siguiente código es un ejemplo de utilización DataAnnotations para la validación de una dirección de email:


[RegularExpression(@"^(?!\.)(""([^""\r\\]|\\[""\r\\])*""|([-a-z0-9!#$%&'*+/=?^_`{|}~]|(?<!\.)\.)*)(?<!\.)@[a-z0-9][\w\.-]*[a-z0-9]\.[a-z][a-z\.]*[a-z]$"
, ErrorMessage = "Dirección de Email no válida")]
public string Email
{
     get
     {
          return email;
     }

     set
     {
          email = value;
          Validator.ValidateProperty(value, new ValidationContext(this, null, null) { MemberName = "Email" });
     }
}

IDataErrorInfo

Por último, mostrar un nuevo método de manejo de validaciones introducido en Silverlight 4, la interfaz IDataErrorInfo. Las entidades que implementen esta interfaz tendrán, por un lado, una propiedad Error utilizada para aportar una descripción del estado de la validación del objeto a nivel general, y por otro, un indizador al que se llamará cada vez que se produzca una operación de binding y al que se le pasa como parámetro el nombre de la propiedad envuelta en el proceso (Más información sobre indizadores aquí).

En la siguiente pieza de código se puede ver la implementación del get del indizador. En él tan solo hay identificar la propiedad, ejecutar la función que valide el valor y devolver el mensaje de error correspondiente.

#region IDataErrorInfo Members

public string Error
{
     get { return null; }
}

public string this[string columnName]
{
     get
     {
          if (columnName.Equals("Email") && !Email.IsValidEmailAddress())
              return "Dirección de correo no válida";
          return null;
     }
}

#endregion

Sin embargo, esta forma de hacer el tratamiento de las validaciones no es la idónea. En este sentido, se suele utilizar una clase que gestione las validaciones. Un ejemplo de este tipo de clase es la creada por John Papa y que podemos encontrar en Silverlight Overview – Technical Whitepaper.

Por otro lado, ya en el xaml, existe una propiedad ValidatesOnDataErrors que hay que poner a True, además de ValidatesOnExceptions.

Resultado

El resultado con cualquiera de los tres métodos es el mismo y es el que aparece a continuación:

Validacion con Excepciones
Validacion con Excepciones

Fuentes:

Anuncios
Esta entrada fue publicada en Silverlight y etiquetada , , , , . Guarda el enlace permanente.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s