流利的验证-自定义引导验证器不会触发

时间:2018-11-20 13:05:41

标签: asp.net asp.net-core fluentvalidation

我有一个自定义的FleuntValidation验证规则,用于检查Guid是否有效;

 public static class GuidValidator
{
    private static Regex isGuid = new Regex(@"^(\{){0,1}[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}(\}){0,1}$", RegexOptions.Compiled);
    public static bool IsGuid(string candidate)
    {
        if (candidate != null)
        {
            if (isGuid.IsMatch(candidate))
            {
                return true;
            }
        }
        return false;
    }
}

我想用它来检查Guid属性中的有效Guid,然后返回自定义错误消息。

RuleFor(x => x.ShiftId).Must(guid => GuidValidator.IsGuid(guid.ToString())).WithMessage("StopShift.ShiftId.GuidNotValid()");

但是,我的规则没有被执行,因为我猜该Guid无效,并且某些内置检查在它之前运行。我将如何禁用内置检查,以便达到我的自定义规则?

2 个答案:

答案 0 :(得分:2)

这取决于堆栈的外观。 Guid不会使用“无效”值实例化。

如果您想满足某个用例,其中所讨论的值可以是有效的Guid或无效的值,建议您将其建模为字符串。

例如

[Validator(typeof(FooRequestValidator))]
public class FooRequest
{
    public string Bar { get; set; }
}

public class FooRequestValidator : AbstractValidator<FooRequest>
{
    public FooRequestValidator()
    {
        RuleFor(x => x.Bar)
            .Must(ValidateBar).WithErrorCode("Not a guid");
    }

    private bool ValidateBar(string bar)
    {
        return Guid.TryParse(bar, out var result);
    }
}

答案 1 :(得分:0)

该类中的属性是不可为空的Guid。

public Guid ProductId {get;set;}

这是我用的

RuleFor(product => product.ProductId).Must(BeAValidGuid).When(product => product.ProductId != null);

使用自定义规则

private bool BeAValidGuid(Guid unValidatedGuid)
    {
        try
        {
            if(unValidatedGuid != Guid.Empty && unValidatedGuid != null )
            {
                if (Guid.TryParse(unValidatedGuid.ToString(), out Guid validatedGuid))
                {
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }

        }
        catch (Exception)
        {
            throw;
        }
    }