Это мои правила:
public class CambiarPasswordViewModelValidator : AbstractValidator<CambiarPasswordViewModel>
{
public CambiarPasswordViewModelValidator(
IStringLocalizer<CambiarPasswordViewModelValidator> localizer,
IStringLocalizer<SharedLocalizer> sharedLocalizer)
{
RuleFor(c => c.ContraseñaActual)
.NotEmpty().WithMessage(sharedLocalizer["Requerido *"]);
RuleFor(c => c.ContraseñaNueva)
.NotEmpty().WithMessage(sharedLocalizer["Requerido *"])
.Equal(c => c.ContraseñaConfirmacion)
.When(c => !string.IsNullOrWhiteSpace(c.ContraseñaNueva))
.WithMessage(localizer["Nueva Contraseña y Confirmación no concuerdan"]);
RuleFor(c => c.ContraseñaConfirmacion)
.NotEmpty().WithMessage(sharedLocalizer["Requerido *"]);
}
}
Моя проблема в том, что второе правило не работает должным образом. Мне нужна проверка ContraseñaNueva, когда она пуста, а также когда значение не равно ContraseñaConfirmacion, однако для ввода на странице бритвы вводится только пустая проверка. Если я изменю порядок, проверка Equal сработает, а NotEmpty — нет.





достаточно будет разделить правила,
RuleFor(c => c.ContraseñaNueva)
.NotEmpty().WithMessage(sharedLocalizer["Requerido *"]);
RuleFor(c => c.ContraseñaNueva)
.Equal(c => c.ContraseñaConfirmacion)
.When(c => !string.IsNullOrWhiteSpace(c.ContraseñaNueva))
.WithMessage(localizer["Nueva Contraseña y Confirmación no concuerdan"]);
Я заметил, что у беглой проверки есть проблемы с внедрением нескольких условий в одно правило в атрибуты ввода страницы бритвы вместо использования аннотаций данных, которые помещают все правила. Мой проект - ядро MVC asp.net (не веб-API).
@AldemarCuartasCarvajal: решение levent должно работать с учетом требований, изложенных в вашем вопросе. Вам нужно разделить эти правила на два разных вызова RuleFor и использовать метод When для второго правила, чтобы он выполнялся только тогда, когда ContraseñaNueva имеет значение.
levent, при этом он добавил только первое правило, поэтому, когда я проверяю ModelState на наличие ошибок, мне показывается только сообщение «Requerido *»: <div class = "ffl-wrapper"> <label class = "ffl-label" для = "Contrase_aNueva">Contraseña Nueva *</label> <input class = "form-control" type = "password" data-val = "true" data-val-required = "Requerido *" id = "Contrase_aNueva" name= "ContraseñaNueva"> <span class = "text-danger field-validation-valid" data-valmsg-for = "ContraseñaNueva" data-valmsg-replace = "true"></span> </div>