2009-08-31 12 views
7

Ho una classe cliente che ha sia proprietà PhoneNumber che Email. Utilizzo di DataAnnotations Posso decorare le proprietà con gli attributi di convalida DataType, ma non riesco a vedere cosa mi stia facendo.Esiste un buon riferimento per le annotazioni dei dati in merito a come funziona DataType?

Ad esempio:

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

ho una prova di unità che ha assegnato "1515999A" a questa proprietà. Quando passo il runner di validazione il valore è considerato valido per un numero di telefono. Avrei pensato che questo non dovrebbe essere valido.

Ho cercato in giro un po 'ma non sono riuscito a trovare una spiegazione decente di ciò che i vari DataType enumerati effettivamente catturano. C'è qualche riferimento utile da qualche parte?

Edit:

Ecco le budella di quello che sto usando per un corridore di convalida ...

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

È questo in framework 3.5 o 4.0? Quale corridore di validazione stai usando? –

+0

Buon commento. Sto usando 3.5 e sto usando un runner di convalida personalizzato abbastanza semplice (postando il codice sopra). –

risposta

7

non ho potuto trovare molto sul web su DataType.PhoneNumber, ma ho trovato questo:

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

Nella versione RTM, il DataType.EmailAddress viene utilizzato solo per contrassegnare il tipo di dati per il proprio uso di .

Volevo saperne un po 'di più, così ho estratto il .NET Reflector di Red Gate e ho iniziato a scavare.

Guardando la classe DataTypeAttribute, Joseph Daigle è perfetto - ogni attributo DataType non esegue alcuna convalida; è sempre restituisce true (cioè "valido"). Su alcuni tipi di dati, viene eseguita una formattazione personalizzata della stringa di visualizzazione. I numeri di telefono, tuttavia, sono praticamente rimasti intatti.

Quindi, ho esaminato le possibili soluzioni a questo problema. Da quello che ho trovato, this si presenta come il migliore:

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

Naturalmente, che convalida se un numero è pari o dispari. È possibile scrivere un attributo di convalida personalizzato per PhoneNumber, Email, ecc. Che in realtà è valido per la convalida.

+0

Ho visto questa domanda senza risposta nella mia lista e mi sono reso conto che in effetti hai risposto correttamente e merita di essere contrassegnato come tale. Ci scusiamo per il lungo ritardo. –

+0

Nessun problema - contento che sia stato d'aiuto, e grazie :) – Doug

1

Il DataTypeAttribute è un ValidationAttribute. Ma SEMPRE restituisce vero ... quindi non ha alcuna convalida reale.

(so che questo è vero per 3,5, non sono sicuro se è vero per 4,0)

+0

Sono abbastanza nuovo in MVC e mi chiedevo se restituisse sempre true, dovrei preoccuparmi di impostare quale tipo è? Come migliorerà il mio codice? –

+0

Il DataTypeAttribute non è stato progettato per la convalida. Le annotazioni dei dati sono proprio questo: attributi che annotano i dati. Alcuni sono usati per la validazione, altri sono usati per descrivere semplicemente ciò che i dati rappresentano. –

0

Forse è perché i numeri di telefono può contenere lettere? wiki

3

Numero di telefono, zip deve essere convalidato con il RegularExpressionAttribute Class

+0

A meno che tu non riesca a mostrarmi una regex che in realtà convalida rispetto all'attuale RFC, l'Email dovrebbe essere SOLO validata inviando una email di prova all'indirizzo. Sono stufo dei siti che mi dicono che non posso avere un "+" nel mio indirizzo o che il mio TLD non è valido. – slipsec

Problemi correlati