Остановите всю дальнейшую проверку, если множественная проверка для первого поля не пройдена - PullRequest
0 голосов
/ 19 января 2020

Я пытаюсь написать правила для проверки поля для проверки.

Сначала я хочу проверить, является ли Location Id empty, null или exist в базе данных, а затем обрабатывается только для другой проверки.

Но с кодом, который я использовал, только проверяйте, если empty, он не останавливается, если Location Id не существует в базе данных.

Регистрация модели

public class RegisterModel
{
    public long LocationId {get;set;}
    public long FirstName {get;set;}
    public long LastName {get;set;}

    //...other property to be added
}

JSON я перехожу к API:

{
    "FirstName": "John",
    "LocationId": "1234534",
}

* * * * * * * * * * * * * * * * * * * * не существует в базе данных: * Я получаю ответ как:

{
    "Errors": [
        {
            "FieldName": "LastName",
            "Message": "'Last Name' must not be empty."
        },
        {
            "FieldName": "LocationId",
            "Message": "Invalid request."
        }
    ]
}

Правило проверки я использую:

public class RegisterModelValidator : AbstractValidator<RegisterModel>
{
    private readonly DbContext _context;

    public RegisterModelValidator(DbContext context)
    {
        this._context = context;
        this.CascadeMode = CascadeMode.StopOnFirstFailure;
        RuleFor(req => req.LocationId)
          .NotEmpty().WithMessage("param1 is missing.")
          .Must(IsValidRequest).WithMessage("Invalid request.");

        When(x => x.LocationId != null, () => {

            RuleFor(x => x.FirstName).Cascade(CascadeMode.StopOnFirstFailure).NotNull().NotEmpty();
            RuleFor(x => x.LastName).Cascade(CascadeMode.StopOnFirstFailure).NotNull().NotEmpty();

        });

    }

    private bool IsValidRequest(string req)
    {
        var locationId = long.TryParse(req, out long result) ? result : 0;
        return _context.Locations.Any(x => x.LocationExtId == locationId);
    }

    private bool BeAValidDate(string value)
    {
        DateTime date;
        return DateTime.TryParse(value, out date);
    }
}

В моем состоянии я хочу, чтобы, если location id отсутствует или не существует в базе данных, проверка должна быть немедленно прекращена, она не должна проверять другое поле.

1 Ответ

1 голос
/ 19 января 2020

Если вы посмотрите на документы здесь , они упоминаются как

Установка каскадного режима применима только к валидаторам в той же цепочке RuleFor. Изменение каскадного режима не влияет на отдельные вызовы RuleFor. Если вы хотите запретить запуск одного правила в случае сбоя другого правила, вам следует вместо этого использовать Dependent Rules (ниже)

Так что вы можете попробовать это так, используя Зависимые правила

RuleFor(x => x.FirstName).NotNull().NotEmpty()
          .DependentRules(d => d.RuleFor(req => req.LocationId)
          .NotEmpty().WithMessage("param1 is missing.")
          .Must(IsValidRequest).WithMessage("Invalid request."));

Но я вижу, если мы будем использовать его таким образом, я думаю, что его следует повторить для нескольких свойств.

или для вас лучше использовать PreValidate, поскольку

Сначала я хочу проверить, является ли Идентификатор местоположения пустым, нулевым или существует в базе данных

Предварительно проверить свойство

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...