2010-10-07 14 views
1

J'ai plusieurs questions à propos de la validation à l'aide d'annotations de données. J'utilise la configuration suivanteValidation de l'unicité avec des annotations de données dans asp.net mvc

asp.net mvc 2 Entity Framework annotations de données

Fondamentalement, je suis en train d'obtenir la validation de travail unique et je suis un peu confus. Mes modèles sont les suivants:

public class Buyer 
{ 
    public int Id { get; set; } 

    [Required(ErrorMessage = "The email is required")] 
    public string Email { get; set; } 

    [Required(ErrorMessage= "The name is required")] 
    public string Name { get; set; } 
} 

    public class Seller 
{ 
    public int Id { get; set; } 

    [Required(ErrorMessage = "The email is required")] 
    public string Email { get; set; } 

    [Required(ErrorMessage= "The name is required")] 
    public string Name { get; set; } 
} 

J'ai mis en place un attribut de champ unique comme suit

public class UniqueFieldAttribute : ValidationAttribute 
{ 
    public IUniqueValidator Validator { get; set; } 
    public int Id { get; set; } 

    public override bool IsValid(object value) 
    { 
     if (value == null) 
     { 
      return true; 
     } 

     return Validator.IsValid(Convert.ToString(value), Id); 
    }    
} 

J'ai ensuite créé un validateur qui implémente l'interface IUniqueValidator:

public class BuyerUniqueEmailValidator : IUniqueValidator 
{ 
    public bool IsValid(string value, int id) 
    { 
     TheDb db = new TheDb(); 


     var existing = from Buyer b in db.Buyers 
         where b.Email.ToLower() == value.ToLower() 
         select b; 

     foreach (Buyer b in existing) 
     { 
      if (b.Id != id) 
      { 
       return false; 
      } 
     } 

     return true; 
    } 
} 

L'idée y a-t-il! Cependant, lors de l'exécution, j'ai des problèmes. Lorsque j'ajoute ceci

[UniqueField(Validator=new BuyerUniqueEmailValidator(), Id=this.Id ErrorMessage= "This email is in use")] 

le projet ne compilera pas.

Fondamentalement, ce que je veux savoir est s'il est possible de passer une classe à validationAttribute pour effectuer la validation? Aussi, comment puis-je passer un identifiant. De plus, est-il possible de créer un générateur de champ générique unique qui fonctionnerait pour tous mes modèles qui ont un champ email, ou dois-je avoir un BuyerEmailValidator, un SellerEmailValidator etc, etc. T fonctionne correctement.

Seulement préoccupé par serverside pour le moment.

Merci

Répondre

0

Votre mise en œuvre du code de cela ne peut pas voir tous les enregistrements non visibles à sa propre transaction, et, par conséquent, ne peut pas fonctionner de manière fiable dans un environnement multi-utilisateur. Pourquoi ne pas utiliser une contrainte DB?

+0

Je vais ajouter une contrainte de db en production. Cependant, c'est plus une question philosophique. Que les courriels soient uniques est une règle de gestion et, par conséquent, elle devrait être mise en œuvre et testée dans mon modèle de domaine. – user10479

+1

Je comprends ce que vous voulez, mais je présume que vous voulez qu'il fonctionne de manière fiable. Vous * ne pouvez * pas le faire au niveau du modèle et le faire fonctionner à 100% du temps. –