mvc dataannotations fluentvalidation

dataannotations - Regla de FluentValidation para mĂșltiples propiedades



fluentvalidation mvc (2)

Tengo un FluentValidator que tiene múltiples propiedades como zip y county, etc. Quiero crear una regla que tome dos propiedades como una construcción RuleFor

public class FooArgs { public string Zip { get; set; } public System.Guid CountyId { get; set; } } public class FooValidator : AbstractValidator<FooArgs> { RuleFor(m => m.CountyId).Must(ValidZipCounty).WithMessage("wrong Zip County"); }

Esto funciona, pero quiero pasar el código postal y el condado a la rue para validar. ¿Cuál es el mejor método para lograr esto?


Acabo de encontrar esta vieja pregunta y creo que tengo una respuesta más simple. Puede pasar fácilmente todo su objeto a su regla de validación personalizada simplificando el parámetro a RuleFor por ejemplo

RuleFor(m => m).Must(fooArgs => ValidZipCounty(fooArgs.Zip, fooArgs.countyId)) .WithMessage("wrong Zip County");

Si el método ValidZipCountry es local a su validador y puede cambiar su firma para tomar un FooArgs entonces el código se simplifica hasta

RuleFor(m => m).Must(ValidZipCounty).WithMessage("wrong Zip County");

El único inconveniente es que el PropertyName en el error de validación resultante será una cadena vacía. Esto puede causar un problema para su código de visualización de validación. Sin embargo, no está realmente claro a qué propiedad pertenece el error, ContryId o Zip , así que esto tiene sentido.


Hay una sobrecarga FooArgs que también le proporciona el objeto FooArgs documentado here . Te permite pasar fácilmente ambos argumentos a tu método de esta manera:

RuleFor(m => m.CountyId).Must((fooArgs, countyId) => ValidZipCounty(fooArgs.Zip, countyId)) .WithMessage("wrong Zip County");