2009-09-17 7 views
2

I ont un objet d'adresse défini simplement comme suit:IDataErrorInfo avec des types complexes

public class Address 
{ 
    public string StreetNumber { get; set; } 
    public string StreetAddress { get; set; } 
    public string City { get; set; } 
    public string PostalCode { get; set; } 
} 

assez simple. Sur le conseil d'une réponse à une autre question j'ai demandé, je fais référence à this poste de blog lors de la liaison de données mon interface utilisateur à un objet de type personne (qui contient un champ Address MailingAddress).

Le problème est que la méthode d'interface IDataError ne valide aucune des propriétés du type d'adresse.

public string this[string columnName] 
{ 
    get 
    { 
     string result = null; 

     // the following works fine 
     if(columnName == "FirstName") 
     { 
      if (string.IsNullOrEmpty(this.FirstName)) 
       result = "First name cannot be blank."; 
     } 
     // the following does not run 
     // mostly because I don't know what the columnName should be 
     else if (columnName == "NotSureWhatToPutHere") 
     { 
      if (!Util.IsValidPostalCode(this.MailingAddress.PostalCode)) 
       result = "Postal code is not in a know format."; 
     } 
     return result; 
    } 
} 

Alors, évidemment, je ne sais pas ce que le columnName sera ... Je l'ai suivi pas à pas et il n'a jamais été autre chose que l'une des propriétés publiques (des types intrinsèques). J'ai même essayé de courir et de casser sur une déclaration comme:

if (columnName.Contains("Mailing") || columnName.Contains("Postal")) 
    System.Windows.Forms.MessageBox.Show(columnName); 

Tous en vain.

Y a-t-il quelque chose qui me manque?

Répondre

3

Vous devez définir IErrorInfo sur toutes les classes pour lesquelles vous souhaitez fournir des messages d'erreur.

+0

à Brian. Je pense que tu n'as pas tout à fait raison. Parfois, l'objet a un comportement et des restrictions différents selon le contexte de l'objet parent. Alors, imaginez si nous avons un objet Somme avec des propriétés Montant et Devise. Maintenant, nous avons des remises de classe avec le montant et la devise. Donc, supposons que nous ayons plusieurs types de transferts de fonds et que, dans certains cas, le montant soit limité par sa nature. Alors, comment le champ de type Sum saurait-il que son montant devrait dans certains cas être limité et dans d'autres - non? –

0

Jetez un oeil à my answer here.

Ceci explique comment utiliser un modelbinder pour ajouter une vérification au niveau de la classe de votre modèle sans avoir à utiliser IDataError - ce qui, comme vous l'avez vu ici, peut être assez maladroit. Il vous permet toujours d'utiliser les attributs [Obligatoire] ou tout autre attribut de validation personnalisé, mais vous permet d'ajouter ou de supprimer des erreurs de modèle individuelles. Pour en savoir plus sur l'utilisation des annotations de données, je recommande fortement this post from Scott Gu.

Questions connexes