【发布时间】:2020-01-26 19:45:12
【问题描述】:
我正在尝试编写验证字段的规则以进行验证。
首先我想检查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",
}
数据库中不存在location id:但我得到的响应为:
{
"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 丢失或在数据库中不存在,验证应该立即停止,它不应该检查其他字段。
【问题讨论】:
标签: fluentvalidation asp.net-core-2.2