7

我有一个同时具有 PhoneNumber 和 Email 属性的客户类。使用 DataAnnotations,我可以使用 DataType 验证属性来装饰属性,但我看不到那是什么。

例如:

 [DataType(DataType.PhoneNumber)]
 public string PhoneNumber {get; set;}

我有一个单元测试,为这个属性分配了“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)));
    }
4

4 回答 4

7

我在网上找不到太多关于 DataType.PhoneNumber 的信息,但我确实找到了这个:

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

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

我想了解更多信息,所以我拿出了 Red Gate 的 .NET Reflector 并开始四处挖掘。

查看 DataTypeAttribute 类,Joseph Daigle 很清楚——每个 DataType 属性都不做任何验证;总是返回真(即“有效”)。在某些数据类型上,完成了一些自定义显示字符串格式。然而,电话号码几乎没有受到影响。

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

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

当然,这可以验证一个数字是奇数还是偶数。您可以为实际进行验证的PhoneNumber、Email 等编写自定义验证属性。

于 2009-12-09T15:46:26.350 回答
3

电话号码、zip 应使用RegularExpressionAttribute 类进行验证

于 2010-11-14T21:28:39.360 回答
1

DataTypeAttribute 是一个 ValidationAttribute。但它总是返回真......所以它不做任何真正的验证。

(我知道这对于 3.5 是正确的,我不确定对于 4.0 是否正确)

于 2009-11-24T20:28:54.393 回答
0

也许是因为电话号码可以包含字母?维基

于 2009-12-08T09:46:02.080 回答