在WEB API上使用Fluent验证进行模型验证

时间:2019-05-16 06:54:32

标签: c# .net asp.net-web-api fluentvalidation

我正在尝试对Web API项目上的模型使用流利的验证。我有两个类,分别为OrderHeader和Items。我在Items类上的属性名称为OrderQty,它是一个整数,并且我已经为OrderQty应用了一条规则,因为它应该仅是数字(即0-9)。每当我以字母数字形式(例如1A)收到OrderQty的JSON请求时,就无法序列化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));

我希望输出应该是,如果JSON请求中的值为1A,那么它将显示错误消息为:

  

TotalOrderQuantity:必须仅包含数字

1 个答案:

答案 0 :(得分:1)

您无法将1A反序列化为int OrderQty。请改用string OrderQty,然后在验证程序中检查.Must(x => int.TryParse(x.OrderQty, out _))

可以确定您的API具有OrderQty must be integer-int OrderQty之类的规范。如果有人尝试发送字符串而不是整数-您可以捕获反序列化异常并使用诸如invalid request: ...

之类的消息拒绝请求