Проверка модели с использованием Fluent Validation в WEB API - PullRequest
0 голосов
/ 16 мая 2019

Я пытаюсь использовать свободную проверку для моих моделей в проекте Web API.У меня есть два класса name OrderHeader и Items.И у меня есть имя свойства как OrderQty в классе Items, которое является целым числом, и я применил правило для OrderQty, поскольку оно должно быть только числом (т. Е. 0-9).всякий раз, когда я получаю запрос JSON для OrderQty в виде буквенно-цифровой (например, 1A), я не могу сериализовать JSON и не могу получить сообщение об ошибке из проверки на Modelstate.Как этого добиться, может кто-нибудь помочь мне в этом, пожалуйста?Заранее спасибо !!!

Я пытался преобразовать OrderQty в ToString() и применил правило, но не смог получить сообщение об ошибке при сериализации JSON.

Мои модальные классы:

public class OrderHeader
{
    public string OrderNumber { get; set; }
    public string Address1 { get; set; }
    public string Address2 { get; set; }
    public string City { get; set; }
    public string State { get; set; }
    public string Zip { get; set; }
    public string Phone { get; set; }
    public string Created { get; set; }
    public List<Items> Items { get; set; }
}

public class Items
{
   public string ItemNumber { get; set; }
   public string Description { get; set; }
   public int OrderQty { get; set; }
   public double Weight { get; set; }
   public double Price { get; set; }
   public string Status { get; set; }
}

Свободные проверки

public class OrderHeaderValidator : AbstractValidator<OrderHeader>
{

    public OrderHeaderValidator()
    {
        RuleFor(x => x.OrderNumber.Trim()).NotEmpty().WithMessage("OrderNumber : cannot be blank.").Length(1, 6).WithMessage("OrderNumber : cannot be more than 6 characters.").Matches("^[0-9]*$").WithMessage("OrderNumber : must contains only numbers");
        RuleFor(x => x.Items).SetCollectionValidator(new ItemValidator());
    }
}


public class ItemsValidator : AbstractValidator<Items>
{

    public ItemsValidator()
    {
        RuleFor(x => x.OrderQty.ToString()).NotNull().WithMessage("TotalOrderQuantity : cannot be blank").Matches("^[0-9]*$").WithMessage("TotalOrderQuantity : must contains only numbers");
        RuleFor(x => x.Status.ToUpper()).NotEmpty().WithMessage("Status : Provide the Status").Length(0, 1).WithMessage("Status : cannot be more than 1 character").Matches("O").WithMessage("Status : Must be 'O'");

    }

}

Сериализация и получение сообщения об ошибке:

 string errors = JsonConvert.SerializeObject(ModelState.Values
                .SelectMany(state => state.Errors)
                .Select(error => error.ErrorMessage));

Я ожидаю, что вывод должен быть, если значение для 1A из запроса JSON, то он отображает сообщение об ошибкекак:

TotalOrderQuantity: должен содержать только цифры

1 Ответ

1 голос
/ 16 мая 2019

Вы не можете десериализовать 1A в int OrderQty.Вместо этого используйте string OrderQty и отметьте .Must(x => int.TryParse(x.OrderQty, out _)) в валидаторе.

Это нормально, что у вашего API есть спецификация, такая как OrderQty must be integer - int OrderQty.Если кто-то пытается отправить строку вместо целого числа - вы можете перехватить исключение десериализации и отклонить запрос с сообщением типа invalid request: ...

...