2009-08-31 13 views
7

Tengo una clase de cliente que tiene propiedades PhoneNumber y Email. Usando DataAnnotations puedo decorar las propiedades con atributos de validación DataType, pero no puedo ver lo que me está obteniendo.¿Existe una buena referencia para las anotaciones de datos con respecto a cómo funciona DataType?

Por ejemplo:

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

tengo una prueba de unidad que asignó "1515999A" a esta propiedad. Cuando paso por el corredor de validación, el valor se considera válido para un número de teléfono. Hubiera pensado que esto debería ser inválido.

Busqué alrededor de algunos, pero no pude encontrar una explicación decente de lo que atrapan los diversos tipos de datos enumerados. ¿Hay alguna referencia que valga la pena en alguna parte?

Editar:

Aquí son las tripas de lo que estoy usando para un corredor de validación ...

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

Es este marco en 3.5 o 4.0? ¿Qué corredor de validación estás usando? –

+0

Buen comentario. Estoy usando 3.5 y estoy usando un corredor de validación personalizado bastante simple (publicando el código anterior). –

Respuesta

7

no pude encontrar mucho en la web sobre DataType.PhoneNumber, pero encontré esto:

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

En la versión RTM, la DataType.EmailAddress sólo se utiliza para marque el tipo de datos para su propio uso .

Quería saber un poco más, así que saqué Reflector .NET de Red Gate y comencé a cavar.

En cuanto a la clase DataTypeAttribute, Joseph Daigle es perfecto: cada atributo DataType no realiza ninguna validación; siempre devuelve verdadero (es decir, "válido"). En algunos tipos de datos, se realiza algún formateo de cadena de visualización personalizada. Sin embargo, los números de teléfono prácticamente no se han tocado.

Por lo tanto, busqué posibles soluciones a este problema. De lo que he encontrado, this parece el mejor:

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

Por supuesto, que valida si un número es par o impar. Puede escribir un atributo de validación personalizado para PhoneNumber, Email, etc. que realmente valida.

+0

Vi esta pregunta sin respuesta en mi lista y me di cuenta de que efectivamente la has respondido correctamente y merece ser marcada como tal. Perdón por la larga espera. –

+0

No hay problema, me alegro de que haya ayudado, y gracias :) – Doug

1

El DataTypeAttribute es una ValidationAttribute. Pero SIEMPRE se vuelve verdadero ... por lo que no hace ninguna validación real.

(sé que esto es cierto para 3.5, no estoy seguro de si es cierto para 4.0)

+0

Soy bastante nuevo en MVC y me preguntaba si siempre es cierto si me importa establecer qué tipo es? ¿Cómo mejorará esto mi código? –

+0

DataTypeAttribute no fue diseñado para validación. Las anotaciones de datos son solo eso: atributos que anotan los datos. Algunos se utilizan para la validación, otros se utilizan para describir simplemente lo que representan los datos. –

0

Tal vez sea porque los números de teléfono pueden contener letras? wiki

3

número de teléfono, código postal debe ser validada con el RegularExpressionAttribute Class

+0

A menos que pueda mostrarme una expresión regular que en realidad valide contra la RFC actual, el correo electrónico SOLO debe validarse enviando un correo electrónico de prueba a la dirección. Estoy harto y cansado de los sitios que me dicen que no puedo tener un "+" en mi dirección, o que mi TLD no es válido. – slipsec

Cuestiones relacionadas