如何验证Guid数据类型?

5
5个回答

6
您可以使用 RegularExpressionAttribute。以下是一个使用格式 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx 的示例:
[RegularExpression(Pattern = "[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}")]

您可以创建自定义验证属性,这可能是更清晰的解决方案。

1
我觉得这个正则表达式会接受00000000-0000-0000-0000-000000000000,这让我有些担心,因为如果人们不小心使用new Guid()而不是Guid.NewGuid(),就会得到这个结果。 - Jordan Morris

4

5
可以尝试使用TryParse而不是构造函数,这样就可以通过控制流而不是异常处理来捕获失败的情况。 - Jon Hanna
同意。TryParse是更好的方法。 - Sean Reilly

1

我知道这个问题很旧了,但是我想在这里提供我的答案,希望它能帮助未来寻找使用验证属性的最简单解决方案的人。

我发现最好的解决方案是实现验证属性并使用微软的TryParse方法(而不是编写自己的正则表达式):

public class ValidateGuid : System.ComponentModel.DataAnnotations.ValidationAttribute
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        return System.Guid.TryParse(value.ToString(), out var guid) ? ValidationResult.Success : new ValidationResult("Invalid input string.");
    }
}

然后像这样使用它:

    [ValidateGuid]
    public string YourId { get; set; }

这样做的另一个好处是,如果应用程序正在验证API调用的请求正文,而YourId不是有效的GUID,则会很好地响应400错误 - 响应正文将具有您指定的错误消息("输入字符串无效")。 无需编写自定义错误处理逻辑 :)

1
不错!但我认为将“Attribute”添加到属性类名称中是一种惯例。即“ValidateGuidAttribute”。然后,您仍然可以使用它与[ValidateGuid]。 - JHBonarius
我进一步调查了一下,微软也在内部使用正则表达式来实现这个功能 - JHBonarius
@JHBonarius 是的,没错。但是微软一定对他们的正则表达式进行了严谨的测试,与我们使用自己的正则表达式相比显著降低了出现问题的可能性。不过,还是感谢你指出这一点 :) - ABVincita

0

这将使用 .Net 内置的 Guid 类型进行验证,因此您不必使用自定义正则表达式(这些正则表达式尚未经过 Microsoft 的严格测试):

public class RequiredGuidAttribute : RequiredAttribute
{
    public override bool IsValid(object value)
    {
        var guid = CastToGuidOrDefault(value);

        return !Equals(guid, default(Guid));
    }

    private static Guid CastToGuidOrDefault(object value)
    {
        try
        {
            return (Guid) value;
        }
        catch (Exception e)
        {
            if (e is InvalidCastException || e is NullReferenceException) return default(Guid);
            throw;
        }
    }
}

然后,您只需像这样使用它:

    [RequiredGuid]
    public Guid SomeId { get; set; }

如果提供以下任何内容到该字段,它将作为默认值(Guid)并被验证器捕获:
{someId:''}
{someId:'00000000-0000-0000-0000-000000000000'}
{someId:'XXX5B4C1-17DF-E511-9844-DC4A3E5F7697'}
{someMispelledId:'E735B4C1-17DF-E511-9844-DC4A3E5F7697'}
new Guid()
null //Possible when the Attribute is used on another type
SomeOtherType //Possible when the Attribute is used on another type

0

这个函数可能会对你有所帮助...

public static bool IsGUID(string expression)
{
    if (expression != null)
    {
        Regex guidRegEx = 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})$");

        return guidRegEx.IsMatch(expression);
    }
    return false;
}

您可以移除静态关键字,或将该函数放入某个实用类中。


1
我觉得这个正则表达式会接受00000000-0000-0000-0000-000000000000,这让我有些担心,因为如果人们不小心使用new Guid()而不是Guid.NewGuid(),就会得到这个结果。 - Jordan Morris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接