自定义验证,用于检查DB中是否已存在电子邮件。救命!

时间:2010-08-12 17:40:16

标签: .net asp.net-mvc data-annotations

我是.net MVC的新手,但我正在努力。我正在尝试创建一个自定义DataAnnotation验证器,以检查是否已注册电子邮件地址。我正在使用LINQ to SQL。我的模型如下:

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

控制器代码:

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

所有其他验证都有效,但ExistingEmailCheck没有。没有错误,没有。有任何想法吗??非常感谢帮助。

沙希德

1 个答案:

答案 0 :(得分:0)

您是否应该将过滤器应用于特定的Property而不是Class?