有没有关于DataType工作原理的数据注释的好参考资料?

7

我有一个客户类,其中包含电话号码和电子邮件属性。使用数据注释(DataAnnotations),我可以在这些属性上应用数据类型验证属性,但我无法看到这给我带来了什么好处。

例如:

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

我有一个单元测试,将 "1515999A" 分配给此属性。当我逐步执行验证程序时,该值被认为是电话号码的有效值。我原以为这应该是无效的。
我在谷歌上搜索了一些内容,但找不到一个合理的解释,说明各种枚举数据类型实际上捕获了什么。是否有一个有价值的参考资料?
编辑:
以下是我用于验证程序的核心...
    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)));
    }

这是在框架3.5还是4.0中?你正在使用哪个验证运行器? - Robert Venables
不错的评论。我正在使用3.5版本,并且正在使用相当简单的自定义验证运行程序(将代码发布在上面)。 - Sailing Judo
4个回答

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

当然,这个验证是用来判断一个数字是奇数还是偶数的。你可以为电话号码、电子邮件等编写自定义验证属性,确实进行验证。

我看到我的列表中有这个问题一直没有回答,意识到你确实已经正确回答了它,它应该被标记为正确答案。很抱歉让你等了这么久。 - Sailing Judo

3

除非你能给我展示一个真正可以针对当前RFC进行验证的正则表达式,否则电子邮件应该仅通过向该地址发送测试电子邮件进行验证。 我已经厌倦了那些告诉我我的地址中不能有“+”,或者我的顶级域名无效的网站。 - slipsec

1

DataTypeAttribute是一个ValidationAttribute。但它总是返回true...所以它并没有进行任何真正的验证。

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


我对MVC相当新,想知道它是否总是返回true,我是否需要关心设置它的类型?这样做会如何改善我的代码? - Michael Grassman
DataTypeAttribute并不是为了验证而设计的。数据注释只是用来注释数据的属性。有些用于验证,而其他一些则仅用于描述数据所代表的内容。 - Joseph Daigle

0

可能是因为电话号码可以包含字母?维基百科


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接