FluentValidation 修改 Must 函数中的错误消息

问题描述 投票:0回答:3

负责验证的内部类我有简单的规则:

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");

但没有任何运气。

如何在验证函数中定义错误消息?

c# asp.net-web-api2 fluentvalidation
3个回答
13
投票

您可以使用 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");
    }
}

1
投票

我不会实现您尝试使用自定义验证函数执行的操作,因为您可以使用

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.");

0
投票

你可以这样做

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}");
            
© www.soinside.com 2019 - 2024. All rights reserved.