【问题标题】:Creating a custom validation through DataAnnotations?通过 DataAnnotations 创建自定义验证?
【发布时间】:2012-10-17 01:13:58
【问题描述】:

好的,所以当我想验证一个属性时,我可能会这样写:

    [Required]
    [StringLength(255)]
    [DataType(DataType.EmailAddress)]
    [RegularExpression(RegexStrings.Email, ErrorMessage = "Email is not valid.")]
    [DataMember(IsRequired = true, Name="Email", Order = 1)]
    public string Email { get; set; }

我喜欢这个,因为在这种情况下,我将它指向我们公共库中的正则表达式字符串,并在它失败时指定错误消息。简单干净。

我的情况是这样的。这是在 WCF RESTful 服务中。我想要以这种方式验证的属性之一需要使用自定义方法进行验证,该方法使用某些业务逻辑进行验证(它检查字符串长度和字节长度)。我可以(以及我如何)设置此自定义验证,以便我可以像上面示例中使用的那样使用它;所以它看起来像:

[StreamValidation(ValidationClass, ErrorMessage = "Serial number is invalid")]
public string Ksn { get; set; }

更新:

我已经构建了以下类作为我的属性:

[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class KsnValidation : ValidationAttribute
{
    public override bool IsValid(object value)
    {
        if (!(value is string)) return false;

        var val = (string) value;
        var bytes = Enumerable
            .Range(0, val.Length / 2)
            .Select(x => Byte.Parse(val.Substring(2 * x, 2), NumberStyles.HexNumber))
            .ToArray();
        return val.Length == 20 && bytes.Length == 10;
    }

    public override string FormatErrorMessage(string name)
    {
        return base.FormatErrorMessage(name);
    }
}

然后修饰以下属性:

[KsnValidation(ErrorMessage = "Wrong Name")]
public string Ksn { get; set; }

但我不确定如何对此进行单元测试

【问题讨论】:

    标签: c# .net wcf validation


    【解决方案1】:

    SO answer 给出了 MVC2 的答案。

    这里是 a post 用于 MVC3 及更高版本。

    基本上你创建一个属性:

    public class MyValidationAttribute: ValidationAttribute
    {
       public MyValidationAttribute()
       { }
    
        protected override ValidationResult IsValid(
               object value, ValidationContext validationContext)
        {
    
            ...
            if (somethingWrong)
            {
                return new ValidationResult(errorMessage); 
            }
            return null; // everything OK
        }
    }
    

    【讨论】:

    • 快速测试会在屏幕上输入错误的数字。我不确定如何进行单元测试,您需要将实体附加到我认为的上下文中。
    • 我运行了我的服务并发送了错误数据,但它从未抛出错误:/
    • 我发现显然,对对象运行验证不会对其子成员这样做。相反,它只验证第一级:/
    【解决方案2】:

    ValidationAttribute 的文档展示了如何创建自定义验证属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      • 2019-07-01
      • 1970-01-01
      • 2019-03-23
      相关资源
      最近更新 更多