【问题标题】:How can I validate Guid datatype?如何验证 Guid 数据类型?
【发布时间】:2012-01-10 04:55:01
【问题描述】:

有没有办法验证 GUID 数据类型?

我正在使用验证属性。 http://msdn.microsoft.com/en-us/library/ee707335%28v=vs.91%29.aspx

【问题讨论】:

    标签: c# wpf entity-framework validation validationattribute


    【解决方案1】:

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

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

    【讨论】:

    • 在我看来,这个正则表达式会接受 00000000-0000-0000-0000-000000000000,我会对此保持警惕,因为如果人们偶然说出 new Guid(),就会得到这样的结果, 而不是 Guid.NewGuid()
    【解决方案2】:

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

    【讨论】:

    • 或 TryParse 而不是构造,因此捕获失败情况将是控制流而不是异常处理。
    • 同意。 TryParse 是更好的方法。
    【解决方案3】:

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

    我发现最好的解决方案是实现验证属性并使用微软的 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 错误 - 并且响应正文将包含错误消息您指定的(“无效的输入字符串。”)。 无需编写自定义错误处理逻辑:)

    【讨论】:

    • 不错!但我认为在属性类名称中添加“属性”是一种约定。 IE。 “验证GuidAttribute”。然后您仍然可以将其与 [ValidateGuid] 一起使用
    • 我对此进行了更多调查,Microsoft also uses a Regex internally for this
    • @JHBonarius 是的,确实如此,但微软必须对他们的正则表达式进行严格的测试,与使用我们自己的正则表达式相比,这大大降低了出现问题的机会。感谢您指出这一点:)
    【解决方案4】:

    此功能可能对您有所帮助....

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

    您可以删除静态或将函数放在某个实用程序类中

    【讨论】:

    • 在我看来,这个正则表达式会接受 00000000-0000-0000-0000-000000000000,我会对此保持警惕,因为如果人们偶然说出 new Guid(),就会得到这样的结果, 而不是 Guid.NewGuid()
    【解决方案5】:

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

    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)结束,并被 Validator 捕获:

    {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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      • 2017-11-29
      • 2021-07-20
      相关资源
      最近更新 更多