Есть ли хорошая справка для аннотаций данных в отношении того, как работает DataType? - PullRequest
7 голосов
/ 31 августа 2009

У меня есть класс клиента, который имеет свойства PhoneNumber и Email. Используя DataAnnotations, я могу декорировать свойства с помощью атрибутов валидации DataType, но я не вижу, что это мне дает.

Например:

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

У меня есть модульный тест, который назначил этому свойству "1515999A". Когда я прохожу бегунок проверки, это значение считается действительным для номера телефона. Я бы подумал, что это должно быть недействительным.

Я гуглил вокруг некоторых, но не смог найти достойного объяснения того, что на самом деле ловят различные перечисленные типы данных. Есть ли где-нибудь стоящая ссылка?

Edit:

Вот то, что я использую для валидатора ...

    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 ]

7 голосов
/ 09 декабря 2009

Я не мог найти много в Интернете о DataType.PhoneNumber, но я нашел это:

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

В версии RTM DataType.EmailAddress используется только для отметьте тип данных для себя использовать.

Я хотел узнать немного больше, поэтому вытащил .NET Reflector от Red Gate и начал копаться.

Глядя на класс DataTypeAttribute, Джозеф Дейгл находится на месте - каждый атрибут DataType не выполняет никакой проверки; is всегда возвращает истину (то есть "действительный"). Для некоторых типов данных выполняется некоторое пользовательское форматирование отображаемой строки. Телефонные номера, однако, в значительной степени остаются нетронутыми.

Итак, я изучил возможные решения этой проблемы. Из того, что я нашел, это выглядит лучше всего:

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 голосов
/ 15 ноября 2010

Номер телефона, почтовый индекс должен быть подтвержден с RegularExpressionAttribute Class

1 голос
/ 24 ноября 2009

DataTypeAttribute является ValidationAttribute. Но он ВСЕГДА возвращает истину ... поэтому он не выполняет никакой реальной проверки.

(я знаю, что это верно для 3.5, я не уверен, правда ли это для 4.0)

0 голосов
/ 08 декабря 2009

Может, потому что номера телефонов могут содержать буквы? вики

...