En un artículo anterior sobre validación de datos con el control DataForm, explicábamos las técnicas que a disposición del desarrollador, existen para efectuar el conjunto de operaciones principales de validación de datos mediante este control, consistentes mayoritariamente, en la utilización de diversos atributos pertenecientes al espacio de nombres DataAnnotations.

Con el uso de los mencionados atributos podemos cubrir el espectro de posibilidades de validación que contemplan los escenarios más comunes. Sin embargo, suele ocurrir con frecuencia, que para ciertos datos o combinaciones de datos, necesitamos una validación con unas características especiales, que pueden no encajar en la casuística estándar que se nos proporciona «de serie». Es en este tipo de situaciones, donde debemos optar por la creación de una validación a medida o personalizada, que cubra los casos que la validación estándar no alcanza a solventar.

Tal tipo de validación conforma el objetivo de este artículo, en el que explicaremos los pasos a seguir para lograr su implementación mediante el control DataForm.

Basándonos en el origen de datos propuesto en el artículo mencionado anteriormente, crearemos un proyecto en Visual Studio 2010 de tipo Silverlight Application con el nombre ValidacionPersonalizada (cuyo código fuente podemos descargar aquí). Al igual que en dicho artículo (recomendamos su consulta para un mayor detalle), el acceso y manipulación de datos estará compuesto por un modelo de datos, servicio de dominio, contexto de dominio, control DomainDataSource y control DataForm.

Una vez que tengamos el control DataForm preparado para realizar las operaciones de visualización y edición de datos, nos pondremos manos a la obra para desarrollar una validación personalizada sobre el campo FirstName del formulario, que esté basada en las siguientes condiciones: deberá empezar por mayúscula y tener una longitud mayor de cinco caracteres.

 

Archivos de código compartidos

En primer lugar, nos posicionaremos en el proyecto Web de la solución y añadiremos al mismo un nuevo archivo con el nombre PruebasSLDomainService.shared.cs. El motivo de emplear esta nomenclatura a la hora de denominar el archivo, radica en que al ser compilada la solución, se generará en el proyecto Silverlight una copia o versión cliente (compartida) del código contenido en el archivo original situado en el proyecto Web servidor.

 

 

La clase ValidationResult

A continuación abriremos el archivo PruebasSLDomainService.shared.cs, y escribiremos el código de una clase que llamaremos NombreCustomerValidador, conteniendo un método con el nombre EsNombreValido, en el que introduciremos la lógica de validación que emplearemos en el campo FirstName del DataForm. El requisito de dicho método consiste en devolver un tipo ValidationResult, que será evaluado por el mecanismo de validación, mostrando su resultado a través del formulario de datos.

En el caso de cumplirse los criterios de validación, se devolverá el campo ValidationResult.Success para indicar dicha situación. Si la validación resulta fallida, devolveremos una nueva instancia de ValidationResult, en cuyo constructor pasaremos el texto con el mensaje informativo para el usuario, y un array con los nombres de las propiedades a las que asociaremos nuestra validación personalizada. Dichas propiedades pertenecerán a la entidad que editaremos mediante el DataForm, y en nuestro caso particular solamente se tratará de la propiedad FirstName.

using System;
using System.ComponentModel.DataAnnotations;

namespace ValidacionPersonalizada.Web
{
    public static class NombreCustomerValidador
    {
        public static ValidationResult EsNombreValido(string sNombre, ValidationContext oValidationCtx)
        {
            if (char.IsUpper(sNombre, 0) && sNombre.Length > 5)
            {
                return ValidationResult.Success;
            }
            else
            {
                return new ValidationResult("El nombre debe empezar por mayúscula y tener más de cinco caracteres",
                    new string[] { "FirstName" });
            }
        }
    }
}

 

Aplicando el validador a los metadatos

Como siguiente paso modificaremos la clase CustomerMetadata (contenida dentro de la clase Customer), situada en el archivo PruebasSLDomainService.metadata.cs, calificando su propiedad FirstName con el atributo CustomValidation, al que pasaremos como parámetros el tipo correspondiente a la clase que acabamos de escribir, que proporciona nuestra validación personalizada; y el nombre del método que contiene la lógica de validación.

internal sealed class CustomerMetadata
{
    //....
    [Display(Order = 2)]
    [CustomValidation(typeof(NombreCustomerValidador), "EsNombreValido")]
    public string FirstName { get; set; }
    //....
}

De esta forma, el control (DataForm) que actúe como interfaz de usuario para la edición de la clase Customer, al editar el valor de la propiedad FirstName, utilizará el mecanismo de validación que hemos asociado a través de este atributo.

 

Probando la validación

Llegados a este punto, solamente queda ejecutar la aplicación, y comprobar que la lógica de validación que hemos desarrollado, funciona correctamente para el campo FirstName del formulario de datos. En la siguiente imagen vemos cómo la validación falla, mostrando el mensaje informativo al usuario.

 

Sin embargo, en esta otra imagen, dado que las condiciones de validación se cumplen, no se muestra el bloque del resumen de validación cuando el campo FirstName pierde el foco.

 

Habiendo verificado que nuestro proceso de validación personalizada funciona correctamente, finalizamos aquí este artículo, que esperamos sirva como complemento de los procesos de validación, cuando esta no pueda ser realizada utilizando los medios habituales disponibles. Espero que os sirva de ayuda.

Un saludo