tool tag planner google .net validation .net-4.0 data-annotations

.net - planner - tag generator instagram



Entendiendo ValidationContext en DataAnnotations (1)

Quiero utilizar Validator.TryValidateValue() pero no entiendo la mecánica. Oye, tengo lo siguiente:

public class User { [Required(AllowEmptyStrings = false)] [StringLength(6)] public string Name { get; set; } }

y el método:

public void CreateUser(string name) {...}

Mi código de validación es:

ValidationAttribute[] attrs = bit of reflection here to populate from User class var ctx = new ValidationContext(name, null, null); var errors = new List<ValidationResult>(); bool valid = Validator.TryValidateValue(name, ctx, errors, attrs);

Funciona bien hasta que el valor del name sea null . Estoy obteniendo ArgumentNullException al crear una instancia de ValidationContext y no entiendo por qué. TryValidateValue() también exige un contexto no nulo. Tengo un valor y una lista de atributos para validar. ¿Para qué sirve ValidationContext ?


Lo único incorrecto de su código es el objeto de instancia para su contexto de validación. La instancia no necesita ser el valor que se está validando. Para Validator.ValidateProperty, sí, debe ser el objeto que posee la propiedad, pero para Validator.ValidateValue, "esto" es suficiente.

Escribí una clase de ayuda de validación para hacer la configuración; Esto me permite pasar valores arbitrarios desde cualquier lugar.

public class ValidationHelper { private List<ValidationResult> m_validationResults = new List<ValidationResult>(); private List<ValidationAttribute> m_validationAttributes = new List<ValidationAttribute>(); public Tuple<bool, List<string>> ValidateDOB(DateTime? dob) { m_validationAttributes.Add(new CustomValidationAttribute(typeof(DateOfBirthValidator), "ValidateDateOfBirth")); bool result = Validator.TryValidateValue(dob, new ValidationContext(this, null, null), m_validationResults, m_validationAttributes); if (result) { return Tuple.Create(true, new List<string>()); } List<string> errors = m_validationResults.Select(vr => vr.ErrorMessage).ToList(); return Tuple.Create(false, errors); } }

Si está validando propiedades que tienen los atributos de validación en la propiedad, es mucho más fácil:

internal void Validate(T value) { if (!m_Initializing && TrackChanges && !Entity.IsImmutable) { Validator.ValidateProperty(value, new ValidationContext(Entity, null, null) { MemberName = PropertyName ?? ModelName }); } }

"Entidad" es una propiedad de la clase actual que hace referencia al objeto que quiero validar. Esto me permite validar propiedades en otros objetos. Si ya estás dentro del objeto, "esto" será suficiente de nuevo.