Validación en acción con el control DataForm de Silverlight (y 2)

Después de abordar en la primera parte de este artículo la configuración del entorno de datos de una aplicación Silverlight, para su posterior acceso mediante el control DataForm, en esta segunda parte entraremos a comentar los mecanismos de validación que podemos implementar al usar este control.

 

Tipos de validación

A continuación describiremos los tipos de validación disponibles, así como su forma de utilización en la aplicación de ejemplo que estamos desarrollando, cuyo código fuente se encuentra disponible aquí.

Dependiendo del modo de edición que realicemos con el DataForm, podemos clasificar las operaciones de validación en las categorías que relacionamos seguidamente, las cuales serán desarrolladas en los próximos apartados:

–Durante la edición.

–Previa a la edición.

–Al cancelar la edición.

–Al borrar un elemento de la colección.

 

Validación durante la edición

Para validar los datos que el usuario introduce en los diferentes campos del DataForm tenemos a nuestra disposición un conjunto de atributos, incluidos también en el espacio de nombres DataAnnotations, que aplicaremos a la clase de metadatos de la entidad: CustomerMetadata. Todos ellos disponen del parámetro ErrorMessage, mediante el cual asignamos un texto informativo que se visualizará en la parte inferior del formulario, en el caso de que no se cumpla la validación. A continuación se describen dichos atributos:

–Required. Calificando la propiedad LastName con este atributo, obligaremos al usuario a introducir un valor en el campo del DataForm asociado a dicha propiedad, como vemos en el siguiente bloque de código.

internal sealed class CustomerMetadata
{
    //....
    [Required(ErrorMessage = "Este campo no puede quedar vacío")]
    public string LastName { get; set; }
    //....
}

El mecanismo de validación del DataForm detectará, a partir de este momento, si el campo LastName queda vacío, mostrando el mensaje de aviso oportuno.

Cuando no se cumple una condición de validación, podemos observar que el DataFom alerta al usuario de tal circunstancia a través de diversos elementos visuales, tales como el cambio de color en la etiqueta y borde del campo, así como un bloque resumen en la parte inferior del formulario, que mostrará todas las validaciones fallidas. También puede aparecer encima del nombre del campo una etiqueta flotante con el texto descriptivo del error; en el caso de que dicho texto no aparezca automáticamente, podemos visualizarlo situando el cursor encima de la esquina superior derecha del campo, cuyo borde aparece remarcado.

 

–StringLength. Mediante este atributo establecemos la longitud máxima de texto que podrá tener el campo del DataForm asociado a la propiedad. Como parámetros del atributo pasaremos dicho valor de longitud y el mensaje a mostrar en el caso de que la validación no tenga éxito.

internal sealed class CustomerMetadata
{
    //....
    [StringLength(10, ErrorMessage = "El nombre de localidad es demasiado largo")]
    public string City { get; set; }
    //....
}

–RegularExpression. Utilizando este atributo podemos aplicar una expresión regular a la propiedad de la clase de entidad, que nos permitirá establecer en el formulario de datos la pauta de entrada del valor en el campo. En nuestro ejemplo lo emplearemos para la propiedad PostalCode, de forma que el usuario tenga que teclear un valor compuesto por cinco números.

 

–Range. Este atributo nos permite establecer un intervalo de los valores que podremos introducir en el campo del DataForm asociado a la propiedad sobre la que aplicamos el atributo. En nuestro caso lo emplearemos para limitar los valores de la propiedad Credit.

internal sealed class CustomerMetadata
{
    //....
    [Range(120.75, 180.25, ErrorMessage = "El crédito debe estar en el intervalo de 120.75 a 180.25")]
    public Nullable<decimal> Credit { get; set; }
    //....
}

 

Validación previa a la edición

Las operaciones que se describen a continuación, si bien no constituyen acciones de validación al uso, ya que no se llevan a cabo cuando el usuario está editando los campos del formulario, hemos decidido incluirlas, ya que nos permiten controlar qué elementos de la entidad formarán parte del DataForm como campos editables.

Los atributos que utilizaremos en este apartado serán los siguientes:

–Editable. Recibe como parámetro un valor lógico, mediante el cual podemos conseguir que el campo del formulario no pueda ser modificado. En el caso de la propiedad CustomerID de la clase CustomerMetadata, dicho campo no puede ser editado para los valores existentes, ya que se trata de la clave primaria de la tabla. Como además, en la definición de la tabla es un campo de tipo identidad, no sería conveniente que el usuario pudiera introducir un valor, ya que en definitiva, es el motor de datos el que generará este valor para los nuevos registros. Por dicho motivo calificaremos la mencionada propiedad con este atributo.

internal sealed class CustomerMetadata
{
    //....
    [Editable(false)]
    public int CustomerID { get; set; }
    //....
}

–Display.AutoGenerateField. Retornamos nuevamente al atributo Display, para utilizar en esta ocasión su parámetro AutoGenerateField, que nos permite impedir la generación de un campo en el DataForm si le asignamos el valor false, lo cual haremos para la propiedad Country de la clase de metadatos.

internal sealed class CustomerMetadata
{
    //....
    [Display(AutoGenerateField = false, Name = "Nación:", Order = 6)]
    public string Country { get; set; }
    //....
}

 

Validación al cancelar la edición

Si nos encontramos en pleno proceso de edición y hacemos clic en el botón Cancel del DataForm, perderemos todos los cambios realizados en los campos del formulario, ya que se volverán a cargar los valores iniciales de la entidad editada.

No obstante es posible dar una oportunidad más al usuario de confirmar la cancelación, puesto que a pesar de haber presionado el botón Cancel, si añadimos un manipulador para el evento EditEnding del DataForm, podremos controlar si finalmente dicha cancelación se lleva a cabo.

El procedimiento a seguir consistirá en tomar el parámetro DataFormEditEndingEventArgs y consultar su propiedad EditAction. Si efectivamente estamos en una operación de cancelación, pedimos al usuario confirmación, asignando el valor true a la propiedad DataFormEditEndingEventArgs.Cancel en el caso de que el usuario opte por conservar las modificaciones que lleva realizadas hasta el momento.

<my1:DataForm x:Name="frmCustomers" 
    ItemsSource="{Binding ElementName=ddsCustomers, Path=Data}"
    Margin="5" 
    EditEnding="frmCustomers_EditEnding" />
private void frmCustomers_EditEnding(object sender, DataFormEditEndingEventArgs e)
{
    if (e.EditAction == DataFormEditAction.Cancel)
    {
        if (MessageBox.Show("¿Seguro que quiere cancelar?", "¡Atención!",
            MessageBoxButton.OKCancel) == MessageBoxResult.Cancel)
        {
            e.Cancel = true;
        }
    }
}

 

Validación al borrar un elemento de la colección

Haciendo clic en el botón con signo menos (botón de borrado) situado en la barra de herramientas del DataForm, de forma similar a la descrita en el apartado anterior, podemos escribir un manipulador para el evento DeletingItem del DataForm, en el que pidamos confirmación al usuario antes de que el borrado se haga efectivo.

Para evitar el borrado simplemente debemos asignar true a la propiedad Cancel del objeto CancelEventArgs que recibe el evento como parámetro.

<my1:DataForm x:Name="frmCustomers" 
    ItemsSource="{Binding ElementName=ddsCustomers, Path=Data}"
    Margin="5" 
    EditEnding="frmCustomers_EditEnding" 
    DeletingItem="frmCustomers_DeletingItem" />

private void frmCustomers_DeletingItem(object sender, System.ComponentModel.CancelEventArgs e) { if (MessageBox.Show("¿Borrar este elemento?", "¡Atención!", MessageBoxButton.OKCancel) == MessageBoxResult.Cancel) { e.Cancel = true; } }

Y llegados a este punto concluimos este artículo en el que hemos abordado diversas características del control DataForm relacionadas con la validación de los datos que manipula. Espero que os resulte de interés y ayuda.

Un saludo. 

6 Comentarios

  1. anonymous

    Muy interesante el material.
    ¿Como puedo hacer para que la validación sea con una verificación en la base de datos ?.
    Por ejemplo, lograr que el usuario no pueda ser ingresados dos veces, verificando que el nombre y apellido ya existía en la base de datos?
    Muchas gracias.
    José

  2. anonymous

    En un artículo anterior sobre validación de datos con el control DataForm, explicábamos

  3. anonymous

    A propósito de un artículo publicado anteriormente, basado en las técnicas de validación

  4. lmblanco

    Hola José

    Gracias por tu interés en el artículo. Respecto al comentario que haces sobre realizar la validación en la base de datos, acabo de subir al blog un nuevo post sobre este tema. Consulta el siguiente enlace, que espero te ayude en lo que necesitas:

    http://geeks.ms/blogs/lmblanco/archive/2010/07/26/validaci-243-n-de-un-origen-de-datos-mediante-el-control-dataform-de-silverlight.aspx

    Un saludo.
    Luismi

  5. anonymous

    Gracias por el post, una pregunta, sabes como puedo cambiar el mensaje de error “Input is not in a correct format” cuando escribes en un campo numerico algo diferente a numeros? lo he intentado con la expresion regular “d” pero no funciona. Gracias de antemano.

  6. lmblanco

    Hola Juan

    Gracias por tu interés en el blog. Respecto al problema que me comentas, he realizado una prueba simulando esta misma situación, y al introducir en un campo numérico de un DataForm, un valor no numérico, el mensaje que he obtenido ha sido “El formato de la entrada no es correcto”. Quizá sea por la versión del idioma del S.O., aunque si lo que te refieres es a personalizar el mensaje predefinido, puedes personalizar este aspecto creando en tu aplicación una clase que realice la validación, asociando dicha clase al campo del DataForm que necesites en los metadatos de la entidad a través del atributo CustomValidation. En el siguiente post del blog tienes un ejemplo de cómo hacerlo:

    http://geeks.ms/blogs/lmblanco/archive/2010/07/04/validaci-243-n-personalizada-con-el-control-dataform-de-silverlight.aspx

    Un saludo.
    Luismi

Leave a Reply

Tema creado por Anders Norén