【问题标题】:Is there a good reference for data annotations in regards to how DataType works?关于 DataType 如何工作的数据注释是否有很好的参考?
【发布时间】:2010-11-24 08:40:35
【问题描述】:

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

例如:

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

我有一个将“1515999A”分配给此属性的单元测试。当我单步执行验证运行程序时,该值被认为对电话号码有效。我会认为这应该是无效的。

我在 Google 上搜索了一些,但找不到关于各种枚举 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)));
    }

【问题讨论】:

  • 这是在框架 3.5 还是 4.0 中?您使用的是哪个验证运行器?
  • 好评。我正在使用 3.5,并且正在使用一个相当简单的自定义验证运行程序(发布上面的代码)。

标签: c# .net validation data-annotations


【解决方案1】:

电话号码,邮编应使用RegularExpressionAttribute Class进行验证

【讨论】:

  • 除非您可以向我展示一个实际验证当前 RFC 的正则表达式,否则只能通过向该地址发送测试电子邮件来验证电子邮件。我厌倦了网站告诉我我的地址中不能有“+”,或者我的 TLD 无效。
【解决方案2】:

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

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

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

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

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

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

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 等编写自定义验证属性。

【讨论】:

  • 我看到这个问题在我的列表中没有得到回答,并意识到您确实已经正确回答了它,它应该被标记为这样。抱歉耽搁了这么久。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    (我知道 3.5 是这样,我不确定 4.0 是不是这样)

    【讨论】:

    • 我对 MVC 还很陌生,想知道它是否总是返回 true 我是否应该设置它是哪种类型?这将如何改进我的代码?
    • DataTypeAttribute 不是为验证而设计的。数据注释就是这样:注释数据的属性。有些用于验证,有些用于简单地描述数据所代表的内容。
    猜你喜欢
    • 1970-01-01
    • 2013-12-28
    • 2012-10-03
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-09-23
    • 2023-03-15
    相关资源
    最近更新 更多