我正在尝试对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:必须仅包含数字
答案 0 :(得分:1)
您无法将1A
反序列化为int OrderQty
。请改用string OrderQty
,然后在验证程序中检查.Must(x => int.TryParse(x.OrderQty, out _))
。
可以确定您的API具有OrderQty must be integer
-int OrderQty
之类的规范。如果有人尝试发送字符串而不是整数-您可以捕获反序列化异常并使用诸如invalid request: ...