我有一个自定义的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无效,并且某些内置检查在它之前运行。我将如何禁用内置检查,以便达到我的自定义规则?
答案 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;
}
}