C# 如何验证Guid数据类型?

C# 如何验证Guid数据类型?,c#,wpf,entity-framework,validation,validationattribute,C#,Wpf,Entity Framework,Validation,Validationattribute,是否有方法验证GUID数据类型 我正在使用验证属性。 您可以使用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}")] 您还可以创建一个自定义验证属性,这可能是一个更干净的解决

是否有方法验证GUID数据类型

我正在使用验证属性。

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

您还可以创建一个自定义验证属性,这可能是一个更干净的解决方案。

您可以编写自己的子类,通过使用System.guid(谢谢Jon!)确保值是guid。

此函数可能会帮助您

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;
}

您可以删除静态表达式或将函数放入某个实用程序类中,这将使用.Net的内置Guid类型进行验证,因此您不必使用自定义正则表达式(未经过Microsoft的严格测试):

然后你就这样使用它:

    [RequiredGuid]
    public Guid SomeId { get; set; }
    [ValidateGuid]
    public string YourId { 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

我知道这个问题真的很老了,但我想我会插入我的答案,希望它能帮助其他人在未来使用验证属性寻找最简单的解决方案

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

然后像这样使用它:

    [RequiredGuid]
    public Guid SomeId { get; set; }
    [ValidateGuid]
    public string YourId { get; set; }
另外一个好处是,如果应用程序正在验证API调用的请求主体,而您的ID不是有效的GUID,它将很好地返回400错误,并且响应主体将包含您指定的错误消息(“无效输入字符串”)。
无需编写自定义错误处理逻辑:)

或TryParse而不是construct,因此捕获失败案例将是控制流而不是异常处理。同意。TryParse是更好的方法。在我看来,这个正则表达式会接受00000000-0000-0000-0000-000000000000,我会很小心,因为如果人们无意中说new Guid(),而不是Guid.NewGuid(),人们会得到它。在我看来,这个正则表达式会接受00000000-0000-0000-000000000000000000,我会很小心,因为如果人们无意中说了new Guid(),而不是Guid.NewGuid()的话,就会得到它。真不错!但我认为在属性类名中添加“Attribute”是一种惯例。即“验证指南属性”。你仍然可以在[ValidateGuid]中使用它,我对此做了更多的研究,@JHBonarius是的,这是真的,但是微软必须对他们的正则表达式进行严格的测试,与使用我们自己的正则表达式相比,这大大减少了出现问题的机会。不过,感谢您指出这一点:)