负责验证的内部类我有简单的规则:
RuleFor(u => u.Id)
.Cascade(CascadeMode.StopOnFirstFailure)
.NotEmpty().WithMessage("Id is required")
.Must(ValidateId);
下面是我的
ValidateId
功能:
private bool ValidateId(CreateAccountBindingModel model, string id, PropertyValidatorContext context)
{
if (id=="test")
{
context.Rule.CurrentValidator.ErrorCodeSource = new StaticStringSource("You are testing");
return false;
}
var idValid = IdValidator.IsValid(id);
if (!idValid)
{
context.Rule.CurrentValidator.ErrorCodeSource = new StaticStringSource("Id is invalid");
return false;
}
return true;
}
如果我运行验证器,我会收到默认错误,而不是我在函数中指定的自定义错误。
我尝试使用以下方法设置它们:
context.Rule.CurrentValidator.ErrorCodeSource = new StaticStringSource("Id is invalid");
但没有任何运气。
如何在验证函数中定义错误消息?
您可以使用 CustomValidator 来代替:
RuleFor(u => u.Id)
.Cascade(CascadeMode.StopOnFirstFailure)
.NotEmpty().WithMessage("Id is required")
.Custom(ValidateId);
下面 -
ValidateId
方法:
private void ValidateId(string id, CustomContext context)
{
if (id == "test")
{
context.AddFailure("You are testing");
}
var idValid = IdValidator.IsValid(id);
if (!idValid)
{
context.AddFailure("Id is invalid");
}
}
我不会实现您尝试使用自定义验证函数执行的操作,因为您可以使用
FluentValidation
本身来实现:
RuleFor(u => u.Id)
.Cascade(CascadeMode.StopOnFirstFailure)
.Must(x => x !="test").WithMessage("You are testing.")
.Must(x => IdValidator.IsValid(x)).WithMessage("Id is invalid.");
你可以这样做
RuleFor(u => u.Id)
.Cascade(CascadeMode.StopOnFirstFailure)
.NotEmpty().WithMessage("Id is required")
.Must((x, id, context) =>
{
if (id == "test")
{
context.MessageFormatter.AppendArgument("errorText", "You are testing");
return false;
}
var idValid = IdValidator.IsValid(id);
if (!idValid)
{
context.MessageFormatter.AppendArgument("errorText", $"Id is invalid");
return false;
}
return true;
}).WithMessage(x => "{errorText}");