Estoy usando System.ComponentModel.DataAnnotations.CustomValidationAttribute para validar una de mis clases de POCO y cuando trato de probarlo por unidad, ni siquiera está llamando al método de validación.

public class Foo
{
  [Required]
  public string SomethingRequired { get; set }
  [CustomValidation(typeof(Foo), "ValidateBar")]
  public int? Bar { get; set; }
  public string Fark { get; set; }

  public static ValidationResult ValidateBar(int? v, ValidationContext context) {
    var foo = context.ObjectInstance as Foo;
    if(!v.HasValue && String.IsNullOrWhiteSpace(foo.Fark)) {
      return new ValidationResult("Either Bar or Fark must have something in them.");
    }
    return ValidationResult.Success;
  }
}

Pero cuando trato de validarlo:

var foo = new Foo { 
  SomethingRequired = "okay"
};
var validationContext = new ValidationContext(foo, null, null);
var validationResults = new List<ValidationResult>();
bool isvalid = Validator.TryValidateObject(foo, validationContext, validationResults);
Assert.IsFalse(isvalid); //FAIL!!! It's valid when it shouldn't be!

Ni siquiera entra en el método de validación personalizado. ¿Lo que da?

7
Ben Lesh 15 abr. 2012 a las 23:09

1 respuesta

La mejor respuesta

Intente usar la sobrecarga que toma un bool que especifica si todas las propiedades deben validarse. Pase verdadero para el último parámetro.

public static bool TryValidateObject(
    Object instance,
    ValidationContext validationContext,
    ICollection<ValidationResult> validationResults,
    bool validateAllProperties
)

Si pasa falso u omite validateAllProperties, solo se marcará RequiredAttribute. Aquí está la documentación de MSDN.

8
Wouter de Kort 15 abr. 2012 a las 23:16
Eso fue exactamente. Gracias.
 – 
Ben Lesh
16 abr. 2012 a las 00:41
El valor predeterminado para este argumento debería haber sido verdadero o este método debería tener un nombre más explícito.
 – 
Maxence
4 feb. 2021 a las 16:56