Проверка целого числа в быстрой проверке, когда символ не является числом - PullRequest
0 голосов
/ 22 апреля 2020

Я установил свободную проверку в моем основном проекте web api. Я создал один валидатор, в котором у меня есть проверки для одного поля.

Мой TrainingDto.cs выглядит так:

public class TrainingDto
{
    public int Id { get; set; }
    public string TrainingName { get; set; }
    public int? NumberOfTrainings { get; set; }
    public decimal Price { get; set; }
}

Мой валидатор выглядит так:

public class TrainingDtoValidator : AbstractValidator<TrainingDto>
{
    public TrainingDtoValidator ()
    {
        RuleFor(x => x.NumberOfTrainings)
            .NotEmpty()
            .WithMessage("Number of trainings can't be empty.")
            .Must((x, list, context) =>
            {
                if (x.NumberOfTrainings.ToString() != "")
                {
                    context.MessageFormatter.AppendArgument("NumberOfTrainings", x.NumberOfTrainings);
                    return Int32.TryParse(x.NumberOfTrainings.ToString(), out int number);
                }
                return true;
            })
            .WithMessage("Number of trainings must be a number.");
    }
}

Проблема в этом втором условии проверки. Когда я набираю букву вместо числа, я получаю сообщение об исключении: «Не удалось преобразовать строку в целое число: a. Путь« numberOfTrainings », строка 1, позиция 24». вместо этого сообщения «Количество тренировок должно быть числом». Я хочу показать на экране мое сообщение проверки вместо этого сообщения об исключении ASP. NET. Число в этом поле должно быть больше 0. Возможно ли это? Есть идеи как это исправить?

1 Ответ

0 голосов
/ 23 апреля 2020

Редактирование на основе OP. Edit:

Поскольку NumberOfTrainings является обнуляемым int, я бы написал правило (используя ваши сообщения), чтобы убедиться, что оно не равно нулю и имеет значение больше 0 следующим образом:

RuleFor(x => x.NumberOfTrainings)
             .NotNull().WithMessage("Number of trainings can't be empty.")
             .GreaterThan(0).WithMessage("Number of trainings must be greater than 0.");

Сокращенный набор тестов для этого правила будет следующим:

var fixture = new Fixture();

var validator = new TrainingDtoValidator();

var dto1 = fixture.Build<TrainingDto>().Without(x => x.NumberOfTrainings).Create();
validator.ShouldHaveValidationErrorFor(x => x.NumberOfTrainings, dto1).WithErrorMessage("Number of trainings can't be empty.");

var dto2 = fixture.Build<TrainingDto>().With(x => x.NumberOfTrainings, -1).Create();
validator.ShouldHaveValidationErrorFor(x => x.NumberOfTrainings, dto2).WithErrorMessage("Number of trainings must be greater than 0.");

var dto3 = fixture.Build<TrainingDto>().With(x => x.NumberOfTrainings, 0).Create();
validator.ShouldHaveValidationErrorFor(x => x.NumberOfTrainings, dto3).WithErrorMessage("Number of trainings must be greater than 0.");

var dto4 = fixture.Build<TrainingDto>().With(x => x.NumberOfTrainings, 1).Create();
validator.ShouldNotHaveValidationErrorFor(x => x.NumberOfTrainings, dto4);

Предыдущий:

public int NumberOfTrainings { get; set; } согласно этому определению не может быть нулевым и не может быть «не числом». Поэтому валидатор пользовательского свойства

.Must((x, list, context) =>
{
    if (x.NumberOfTrainings.ToString() != "")
    {
        context.MessageFormatter.AppendArgument("NumberOfTrainings", x.NumberOfTrainings);
        return Int32.TryParse(x.NumberOfTrainings.ToString(), out int number);
    }
    return true;
})
.WithMessage("Number of trainings must be a number.");

, который преобразует NumberOfTrainings в строку, а затем пытается проанализировать ее в Int32, является излишним. Я даже не уверен, что NotEmpty будет работать так, как вы ожидаете, поскольку int по умолчанию равен 0, что я бы не назвал пустым. Может быть, это проверяет int.MinValue или что-то. Обычно я написал бы правило int, используя валидатор больше / меньше или *.

Можете ли вы уточнить, что такое «действительный NumberOfTrainings»? возможно> = 0? Тогда можно дать лучший ответ.

...