Compartir a través de


Validación de datos de campos personalizados

Última modificación: sábado, 13 de marzo de 2010

Hace referencia a: SharePoint Foundation 2010

La clase de campo personalizado puede contener validación de datos. Todo tipo de campo personalizado puede heredar la validación de su clase de campo primario, puede invalidar la validación de su clase de campo primario o incluso puede llamar la validación de su clase de campo primario como parte de su propia lógica de validación. Se puede especificar la validación de datos personalizados y preactualizar la lógica de procesamiento de la clase de campos personalizados en una invalidación del método GetValidatedString. (La implementación predeterminada simplemente llama al método ToString de la clase del valor; este es el motivo por el que, si la clase de campo hereda directamente de SPField o de una clase derivada que no invalida al método GetValidatedString, usted debe invalidar GetValidatedString para proporcionar la lógica de validación en caso de que fuera necesaria).

Realizar validación de datos

Aunque la validación de datos se puede realizar en varios lugares del código, incluidos los controles de formulario, es recomendable que cualquier lógica de validación de datos del lado servidor necesaria se agregue al método GetValidatedString de la clase de campo personalizado. Esto ayuda a garantizar que la validación de datos necesarios se aplica tanto a los datos del campo como a los de la base de datos de contenido.

En los casos en los que se están actualizando datos por alguno de los siguientes medios:

  • mediante un control de formularios

  • a través de la interfaz de usuario, o

  • mediante programación a través del modelo de objetos,

SharePoint Foundation invoca el método GetValidatedString siempre que los datos estén almacenados en un SPField o en una clase derivada de él. Por ejemplo, SharePoint Foundation invoca el método GetValidatedString cuando se establece un valor de campo en un objeto SPListItem mediante el método SPListItem.this["field name"].

Nota

Los usuarios pueden actualizar los datos en un campo que no invoca el método GetValidatedString y, por tanto, cualquier lógica de validación de datos que contenga el método. Esto incluye el uso de métodos de servicios web o de código no administrado que no invocan el objeto SPListItem para actualizar los datos del campo. Por ejemplo, cuando un usuario actualiza los datos de elementos de lista mediante la vista de hoja de datos, se actualizan los elementos de la lista sin invocar el método GetValidatedString.

Además, se puede usar el método GetValidatedString para devolver mensajes de error de cadena al formulario o aplicación de llamada, lo que permite proporcionar una correcta presentación y control de los errores de validación de datos para la clase de campo.

Para devolver un mensaje de error, el método GetValidatedString debe producir una SPFieldValidationException como un error. Se puede proporcionar el mensaje de error adecuado como parámetros de cadena al constructor SPFieldValidationException. En SharePoint Foundation, si el usuario escribe un valor no válido y hace clic en Aceptar en el formulario, el mensaje aparece en texto rojo junto al campo de los formularios estándar Nuevo y Edición (elemento de lista).

En el ejemplo siguiente se muestra una versión invalidada del GetValidatedString que comprueba que el campo tiene un valor cuando está en un campo obligatorio y que la versión de cadena del valor no supera un límite especificado. (La propiedad Required registra si el campo es obligatorio o no).

public override String GetValidatedString(Object value)
{
    if ((this.Required == true) && (value.ToString() == ""))
    {
        throw new SPFieldValidationException(this.Title 
            + " must have a value.");
    }
    else if (value.ToString().Length > MAXLENGTH)
    {
        throw new SPFieldValidationException(this.Title 
            + " cannot be longer than " + MAXLENGTH.ToString());
    }
    return base.GetValidatedString(value);
} 
Public Overrides Function GetValidatedString(ByVal value As Object) As String
    If (Me.Required = True) AndAlso (value.ToString() = "") Then
        Throw New SPFieldValidationException(Me.Title & " must have a value.")
    ElseIf value.ToString().Length > MAXLENGTH Then
        Throw New SPFieldValidationException(Me.Title & " cannot be longer than " & MAXLENGTH.ToString())
    End If
    Return MyBase.GetValidatedString(value)
End Function

Validación en la interfaz de usuario

Si los usuarios pueden estar estableciendo el valor del campo en una interfaz de usuario distinta a la de los formularios Nuevo o Edición (elemento de lista), entonces también deberían validarse los datos que los usuarios introducen en el control de interfaz de usuario del campo. En concreto, se recomienda que, si el campo debe tener un valor, este requisito se fuerce en el nivel de la interfaz. Si se está utilizando una de las clases integradasSharePoint Foundation que se derivan de BaseFieldControl para representar el campo, solamente se puede confiar en la validación interna para forzar Required. Si está derivando su propio control desde BaseFieldControl o una de sus derivaciones y se invalida el método Validate o CreateChildControls, habrá que forzar Required además de cualquier otra validación de nivel de interfaz de usuario que se desee realizar.

Su lógica de validación de la interfaz de usuario puede estar en el método Validate, el método CreateChildControls o una combinación de ambos. Un punto en contra de la colocación de la lógica de validación en el método CreateChildControls es que el método sólo se invoca cuando el campo se va a representar en un formulario, por lo que si actualiza el valor en el modelo de objetos no se produce la validación.

Si se invalida el método Validate, se deberían obtener resultados estableciendo la propiedad IsValid como true o false y, en este último caso, configurando ErrorMessage con un mensaje adecuado.

A continuación se ofrece un ejemplo de invalidación del método Validate. En primer lugar se comprueba si el modo de control actual es Mostrar, en cuyo caso no tiene en cuenta si el campo no es válido porque no se puede cambiar de todos modos. El método también comprueba si ya se sabe que la propiedad Value no es válida, comprobando la propiedad IsValid. Si alguna de las comprobaciones es True, no hace nada. Si ninguna es True, el método llama a la base Validate que configurará IsValid como false si hay algún error en la propiedad Value y establecerá un ErrorMessage apropiado. (El método BaseFieldControl.Validate no hace nada, por lo que, si la clase cuyo método Validate se invalida se deriva directamente de BaseFieldControl, la llamada al método Validate base se puede omitir). Por último, el método comprueba el valor de Required y fuerza ese valor.

public override void Validate()
{
    if (ControlMode == SPControlMode.Display || !IsValid)
    {
        return;
    }

    base.Validate();

    if (Field.Required && 
        (Value == null || Value.ToString().Length == 0))
    {
        this.ErrorMessage = Field.Title + " must have a value."
        IsValid = false;
        return;
    }
}
Public Overrides Sub Validate()
    If ControlMode = SPControlMode.Display OrElse (Not IsValid) Then
        Return
    End If

    MyBase.Validate()

    If Field.Required AndAlso (Value Is Nothing OrElse Value.ToString().Length = 0) Then
        Me.ErrorMessage = Field.Title & " must have a value."
        IsValid = False
        Return
    End If
End Sub

Nota

Utilice el método RenderValidationMessage para representar el ErrorMessage.

Vea también

Tareas

Tutorial: Crear un tipo de campo personalizado

Conceptos

Tipos de campos personalizados

Procedimiento para crear una clase de campos personalizados