检查 Fluent Validation C# 中特定规则的状态
Checking the status of a specific rule in Fluent Validation C#
我是 fluent validation 的新手。我可以通过某种方式进行这样的验证:
public class GetPayloadQueryValidator: AbstractValidator<string?>
{
public GetPayloadQueryValidator()
{
RuleFor(x => x).NotEmpty();
RuleFor(x => x).NotEmpty().Must(x => isValidJSON(x));
RuleFor(x => x).NotEmpty().Must(x => isValidRequest(x));
}
private bool isValidJSON(string? json)
{
try
{
JToken jsonToken = JObject.Parse(json);
return true;
}
catch (Exception ex)
{
return false;
}
}
private bool isValidRequest(string? json)
{
try
{
JObject? obj = JObject.Parse(json);
if (!obj.HasValues)
{
return false;
}
if (!obj.ContainsKey("fixed") ||
!obj.ContainsKey("data") ||
!obj["data"].HasValues)
{
return false;
}
JObject? data = obj["data"].ToObject<JObject?>();
if(!data.ContainsKey("templateName") || string.IsNullOrEmpty(data["templateName"].ToString()) ||
!data.ContainsKey("primaryObjectName") || string.IsNullOrEmpty(data["primaryObjectName"].ToString()))
{
return false;
}
return true;
}
catch (Exception ex)
{
return false;
}
}
}
所以这里第一个验证器正在检查输入是否只是一个有效的 json。第二个验证器正在检查它是否包含少量属性。
这就是我使用它进行验证的方式。
GetPayloadQueryValidator? QV = new GetPayloadQueryValidator();
ValidationResult? validate = QV.Validate(request.orchestratorData);
if (!validate.IsValid)
{
return JsonConvert.SerializeObject(new { Code = "400", Message = "Bad Request" }).ToString();
}
但这只是告诉我所有这些验证是否成功。但是,如果我需要检查给定的输入字符串是否有效 json(我不需要属性检查),我该如何完成。
更清楚的是,我需要知道一个有效的 json 而不是仅仅得到它满足所有条件。
请帮忙
您可以使用 WithErrorCode
方法说出违反了哪条规则。此外,您不需要在每一行都使用 NotEmpty
因为第一条规则会捕捉到它。例如:
public GetPayloadQueryValidator()
{
RuleFor(x => x).NotEmpty().WithErrorCode("ERR1");
RuleFor(x => x).Must(x => isValidJSON(x)).WithErrorCode("ERR2");
RuleFor(x => x).Must(x => isValidRequest(x)).WithErrorCode("ERR3");
}
并且在您的验证码中:
ValidationResult? validate = QV.Validate("");
if (!validate.IsValid)
{
Console.WriteLine("Not valid because:");
foreach (var error in validate.Errors)
{
// This will print out "ERR1" or "ERR2 or "ERR3" or some combination of them all
Console.WriteLine(error.ErrorCode);
}
}
请注意,如果您在每个验证器之后省略 WithErrorCode
方法,您将获得代表该验证方法的代码。例如 NotEmpty
方法会给你 NotEmptyValidator
而 Must
会给你 PredicateValidator
.
我是 fluent validation 的新手。我可以通过某种方式进行这样的验证:
public class GetPayloadQueryValidator: AbstractValidator<string?>
{
public GetPayloadQueryValidator()
{
RuleFor(x => x).NotEmpty();
RuleFor(x => x).NotEmpty().Must(x => isValidJSON(x));
RuleFor(x => x).NotEmpty().Must(x => isValidRequest(x));
}
private bool isValidJSON(string? json)
{
try
{
JToken jsonToken = JObject.Parse(json);
return true;
}
catch (Exception ex)
{
return false;
}
}
private bool isValidRequest(string? json)
{
try
{
JObject? obj = JObject.Parse(json);
if (!obj.HasValues)
{
return false;
}
if (!obj.ContainsKey("fixed") ||
!obj.ContainsKey("data") ||
!obj["data"].HasValues)
{
return false;
}
JObject? data = obj["data"].ToObject<JObject?>();
if(!data.ContainsKey("templateName") || string.IsNullOrEmpty(data["templateName"].ToString()) ||
!data.ContainsKey("primaryObjectName") || string.IsNullOrEmpty(data["primaryObjectName"].ToString()))
{
return false;
}
return true;
}
catch (Exception ex)
{
return false;
}
}
}
所以这里第一个验证器正在检查输入是否只是一个有效的 json。第二个验证器正在检查它是否包含少量属性。
这就是我使用它进行验证的方式。
GetPayloadQueryValidator? QV = new GetPayloadQueryValidator();
ValidationResult? validate = QV.Validate(request.orchestratorData);
if (!validate.IsValid)
{
return JsonConvert.SerializeObject(new { Code = "400", Message = "Bad Request" }).ToString();
}
但这只是告诉我所有这些验证是否成功。但是,如果我需要检查给定的输入字符串是否有效 json(我不需要属性检查),我该如何完成。
更清楚的是,我需要知道一个有效的 json 而不是仅仅得到它满足所有条件。
请帮忙
您可以使用 WithErrorCode
方法说出违反了哪条规则。此外,您不需要在每一行都使用 NotEmpty
因为第一条规则会捕捉到它。例如:
public GetPayloadQueryValidator()
{
RuleFor(x => x).NotEmpty().WithErrorCode("ERR1");
RuleFor(x => x).Must(x => isValidJSON(x)).WithErrorCode("ERR2");
RuleFor(x => x).Must(x => isValidRequest(x)).WithErrorCode("ERR3");
}
并且在您的验证码中:
ValidationResult? validate = QV.Validate("");
if (!validate.IsValid)
{
Console.WriteLine("Not valid because:");
foreach (var error in validate.Errors)
{
// This will print out "ERR1" or "ERR2 or "ERR3" or some combination of them all
Console.WriteLine(error.ErrorCode);
}
}
请注意,如果您在每个验证器之后省略 WithErrorCode
方法,您将获得代表该验证方法的代码。例如 NotEmpty
方法会给你 NotEmptyValidator
而 Must
会给你 PredicateValidator
.