2011-01-22 12 views
10

En mi modelo, parece que Validate() solo se llama DESPUÉS de que ambas propiedades pasen la validación.¿Por qué solo se llama a IValidatableObject.Validate si se pasa la validación de la propiedad?

public class MyModel : IValidatableObject 
{ 
    [Required] 
    public string Name { get; set;} 

    [Required] 
    public string Nicknames {get; set;} 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 
     if(Nicknames != null && Nicknames.Split(Environment.NewLine.ToCharArray()).Count() < 2) 
      return yield result new ValidationResult("Enter at least two nicknames, new [] { "Nicknames" }); 
    } 
} 

Cuando un usuario entra en una sola línea de texto en el área de texto Nicknames pero deja el cuadro de texto vacío Name, sólo se muestra el mensaje de error Required para la propiedad Name. El mensaje de error que se debe mostrar desde la función Validate() nunca aparece.

Solo después de ingresar un nombre en el cuadro de texto Name y parte del texto en el Nicknames se llama a la función Validate().

¿Es así como se supone que funciona? Parece extraño que a un usuario se le muestre un mensaje de error en una página subsiguiente cuando el error se está causando en la página actual.

Respuesta

14

Esto es por diseño. La validación de nivel de objeto no se activa hasta que todas las propiedades pasan la validación porque, de lo contrario, es posible que el objeto esté incompleto. El método Validate está diseñado para cosas como comparar una propiedad a otra. En su caso, debe escribir un validador de propiedad personalizado.

+2

si el método de validación contiene los resultados de la validación de la propiedad, podemos verificar esto por nosotros mismos. es decir, void IValidatableObject.Validate (List result, ValidationContext validationContext) –

+0

@AnthonyJohnston: Eso es cierto, pero requerir que los desarrolladores lo comprueben significaría que podrían olvidarse fácilmente de verificarlo, lo que da lugar a excepciones de referencia nula en los casos en que el marco también sabe que el modelo no es válido. Creo que este es un caso de ayudar a los desarrolladores a "caer en el abismo del éxito" para casos comunes, y solo requiere un poco más de trabajo en los raros casos en que desean proporcionar aún más información después de que el modelo ya se haya considerado no válido. – StriplingWarrior

Cuestiones relacionadas