有关DataType如何工作的数据注释是否有很好的参考?

Sai*_*udo 7 .net c# validation data-annotations

我有一个客户类,它同时具有PhoneNumber和Email属性.使用DataAnnotations我可以使用DataType验证属性来修饰属性,但我看不出是什么让我感到困惑.

例如:

 [DataType(DataType.PhoneNumber)]
 public string PhoneNumber {get; set;}
Run Code Online (Sandbox Code Playgroud)

我有一个单元测试,为此属性分配了"1515999A".当我单步执行验证运行器时,该值被认为对电话号码有效.我原以为这应该是无效的.

我在一些人周围搜索,但找不到各种枚举的DataTypes实际捕获的正确解释.某处有值得参考的地方吗?

编辑:

以下是我用于验证跑步者的内容......

    public virtual XLValidationIssues ValidateAttributes<TEntity>(TEntity entity)
    {
        var validationIssues = new XLValidationIssues();

        // Get list of properties from validationModel
        var props = entity.GetType().GetProperties();

        // Perform validation on each property
        foreach (var prop in props)
            ValidateProperty(validationIssues, entity, prop);

        // Return the list
        return validationIssues;
    }

    protected virtual void ValidateProperty<TEntity>(XLValidationIssues validationIssues, TEntity entity, PropertyInfo property)
    {
        // Get list of validator attributes
        var validators = property.GetCustomAttributes(typeof(ValidationAttribute), true);
        foreach (ValidationAttribute validator in validators)
            ValidateValidator(validationIssues, entity, property, validator);
    }

    protected virtual void ValidateValidator<TEntity>(XLValidationIssues validationIssues, TEntity entity, PropertyInfo property, ValidationAttribute validator)
    {
        var value = property.GetValue(entity, null);
        if (!validator.IsValid(value))
            validationIssues.Add(new XLValidationIssue(property.Name, value, validator.FormatErrorMessage(property.Name, value)));
    }
Run Code Online (Sandbox Code Playgroud)

Dou*_*oug 7

我在网上找不到关于DataType.PhoneNumber的内容,但我确实发现了这个:

http://forums.asp.net/p/1370546/2863383.aspx

在RTM版本中,DataType.EmailAddress仅用于标记您自己使用的数据类型.

我想找到更多,所以我拿出Red Gate的.NET Reflector并开始挖掘.

查看DataTypeAttribute类,Joseph Daigle就位于其中 - 每个DataType属性都不进行任何验证; 总是返回true(即"有效").在某些数据类型上,完成了一些自定义显示字符串格式化.但是,电话号码几乎不受影响.

所以,我研究了这个问题的可能解决方案.从我发现的,看起来是最好的:

public class EvenNumberAttribute : ValidationAttribute
{
    public EvenNumberAttribute() : base(() => Resource1.EvenNumberError) { }
    public EvenNumberAttribute(string errorMessage) : base(() => errorMessage) { }

    protected override ValidationResult IsValid(object value, 
        ValidationContext validationContext)
    {
        if (value == null)
        {
            return ValidationResult.Success;
        }

        int convertedValue;
        try
        {
            convertedValue = Convert.ToInt32(value);
        }
        catch (FormatException)
        {
            return new ValidationResult(Resource1.ConversionError);
        }

        if (convertedValue % 2 == 0)
        {
            return ValidationResult.Success;
        }
        else
        {
            return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,这可以验证数字是奇数还是偶数.你可以写为******中国,Email等自定义验证属性,实际上验证.