FluentValidation изменить сообщение об ошибке в функции Must

c# asp.net-web-api2 fluentvalidation

2641 просмотра

3 ответа

1709 Репутация автора

Внутри класса, который отвечает за проверку, у меня есть простое правило:

RuleFor(u => u.Id)
    .Cascade(CascadeMode.StopOnFirstFailure)
    .NotEmpty().WithMessage("Id is required")
    .Must(ValidateId);

и ниже моя ValidateIdфункция:

private bool ValidateId(CreateAccountBindingModel model, string id, PropertyValidatorContext context)
{
    if (id=="test")
    {
        context.Rule.CurrentValidator.ErrorCodeSource = new StaticStringSource("You are testing");
        return false;
    }

    var idValid = IdValidator.IsValid(id);
    if (!idValid)
    {
        context.Rule.CurrentValidator.ErrorCodeSource = new StaticStringSource("Id is invalid");
        return false;
    }
    return true;
}

Если я запускаю свой валидатор, я получаю ошибку по умолчанию, а не мои собственные ошибки, которые я указываю внутри своей функции.
Я попытался установить их с помощью:

context.Rule.CurrentValidator.ErrorCodeSource = new StaticStringSource("Id is invalid");

но без удачи.

Как определить сообщение об ошибке внутри функции проверки?

Автор: Misiu Источник Размещён: 19.07.2016 09:20

Ответы (3)


1 плюс

6693 Репутация автора

Я бы не реализовал то, что вы пытаетесь сделать, с помощью пользовательской функции проверки, так как вы можете сделать это используя FluentValidationсебя:

RuleFor(u => u.Id)
 .Cascade(CascadeMode.StopOnFirstFailure)
 .Must(x => x !="test").WithMessage("You are testing.")
 .Must(x => IdValidator.IsValid(x)).WithMessage("Id is invalid.");
Автор: toadflakz Размещён: 19.07.2016 09:26

4 плюса

14560 Репутация автора

Решение

Вы можете определить сообщение об ошибке, используя MessageBuilder:

if (id == "test")
{
    context.Rule.MessageBuilder = c => "You are testing";
    return false;
}
Автор: Aleksey L. Размещён: 19.07.2016 10:52

2 плюса

165 Репутация автора

Вместо этого вы можете использовать CustomValidator:

RuleFor(u => u.Id)
    .Cascade(CascadeMode.StopOnFirstFailure)
    .NotEmpty().WithMessage("Id is required")
    .Custom(ValidateId);

А ниже - ValidateIdметод:

private void ValidateId(string id, CustomContext context)
{
    if (id == "test")
    {
         context.AddFailure("You are testing");
    }
    var idValid = IdValidator.IsValid(id);
    if (!idValid)
    {
        context.AddFailure("Id is invalid");
    }
}
Автор: tarn Размещён: 27.03.2018 09:22
Вопросы из категории :
32x32