Asp.net 流畅验证-自定义Guid验证程序未触发

Asp.net 流畅验证-自定义Guid验证程序未触发,asp.net,asp.net-core,fluentvalidation,Asp.net,Asp.net Core,Fluentvalidation,我有一个自定义的FluntValidation验证规则,用于检查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);

我有一个自定义的FluntValidation验证规则,用于检查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是无效的,并且一些内置的检查在它之前运行。如何禁用内置检查以达到自定义规则?

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

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

e、 g

[Validator(typeof(FooRequestValidator))]
公共类请求
{
公共字符串条{get;set;}
}
公共类FooRequestValidator:AbstractValidator
{
公共FooRequestValidator()
{
规则(x=>x.Bar)
.Must(ValidateBar).WithErrorCode(“非guid”);
}
专用布尔ValidateBar(字符串栏)
{
返回Guid.TryParse(条形图,输出变量结果);
}
}

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

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

e、 g

[Validator(typeof(FooRequestValidator))]
公共类请求
{
公共字符串条{get;set;}
}
公共类FooRequestValidator:AbstractValidator
{
公共FooRequestValidator()
{
规则(x=>x.Bar)
.Must(ValidateBar).WithErrorCode(“非guid”);
}
专用布尔ValidateBar(字符串栏)
{
返回Guid.TryParse(条形图,输出变量结果);
}
}

类中的属性是不可为空的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;
        }
    }

类中的属性是不可为空的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;
        }
    }