2010-08-12 10 views
0

Je suis nouveau à .net MVC, mais je fais des avances. J'essaie de créer un validateur DataAnnotation personnalisé qui vérifie si une adresse e-mail est déjà enregistrée. J'utilise LINQ to SQL. Mon modèle est ci-dessous:Validation personnalisée qui vérifie si le courrier électronique existe déjà dans la base de données. AIDEZ-MOI!

// Model 
public class UsersRepository 
{ 
    private DigitalentDataContext db = new DigitalentDataContext(); 
    BaseController baseController = new BaseController(); 

    // 
    // Add talent user 
    public void AddTalentUser(User user, TalentDetail talentDetail) 
    { 
     user.TalentDetails.Add(talentDetail); 
     db.Users.InsertOnSubmit(user); 
     db.SubmitChanges(); 
     string activationID = user.ActivationID.ToString(); 
     string activationEmail = user.Email;    
     baseController.SendConfEmail(activationID, activationEmail); 
    } 

    public IQueryable<User> GetAllUsers() 
    { 
     return db.Users; 
    } 
} 

//Validation 

[MetadataType(typeof(UserValidation))] 
public partial class User { } 

[Bind(Exclude = "UserID")] 
[ExistingEmailCheck("Email", ErrorMessage="Email address already registered")] 
public class UserValidation 
{ 
    [Required(ErrorMessage = "First name required"), StringLength(20, MinimumLength=3, ErrorMessage = "Must be between 3 and 20 characters")] 
    public string FirstName { get; set; } 

    ... 

} 

public class ExistingEmailCheckAttribute : ValidationAttribute 
{ 
    public ExistingEmailCheckAttribute(string emailToCheck) { 
     EmailToCheck = emailToCheck; 
    } 

    public string EmailToCheck { get; private set; } 

    private UsersRepository _UserRep = new UsersRepository();   

    public override bool IsValid(object value) 
    { 
     int existingEmailCount = _UserRep.GetAllUsers().Where(g => g.Email == EmailToCheck).Count(); 
     return existingEmailCount == 0; 
    } 
} 

Code contrôleur:

[HttpPost] 
    public ActionResult Signup(User user, TalentDetail talentDetail) 
    { 
     if (ModelState.IsValid) { 

      user.ActivationID = System.Guid.NewGuid(); 
      user.ActivationStatus = false; 
      user.DateCreated = DateTime.Now; 

      userRepository.AddTalentUser(user, talentDetail);      
      return RedirectToAction("confirm", "login"); 
     } 
     return View(user); 
    } 

Tous les autres travaillent, mais la validation ExistingEmailCheck ne fonctionne pas. Pas d'erreur, rien. Des idées?? L'aide est très appréciée.

Shahid

+3

Que signifie "Ne semble pas fonctionner?" signifier? Cela fonctionne ou non, et si ce n'est pas le cas, qu'est-ce que cela signifie, exception, ne valide pas, ne demande pas, les points d'inflexion ne touchent pas? Quel est le code de votre contrôleur? – jfar

+0

@Gnomo, s'il vous plaît élaborer? – shahidaltaf

+0

L'utilisation d'un attribut pour effectuer une logique métier est vraiment mauvaise à mon avis. Vérifiez que l'adresse e-mail est unique au moment de l'insertion et lancez une exception. – Ryan

Répondre

0

Si vous appliquez pas le filtre à la propriété spécifique au lieu de la classe?

+0

Ryan à la rescousse. Voir les commentaires – shahidaltaf