代码之家  ›  专栏  ›  技术社区  ›  Hydro

将输入到数据库的电子邮件地址与DataAnnotations进行比较

  •  3
  • Hydro  · 技术社区  · 11 年前

    我的MVC模型中有一个类:

    public class NewModel
    {
        public bool AllComplexes { get; set; }
        public int UserID { get; set; }
        public int? RoleID { get; set; }
        public int ComplexID { get; set; }
    
        [Required(ErrorMessage = "Please enter a user name."), StringLength(50)]
        public string Username { get; set; }
    
        [Required(ErrorMessage = "Please enter Password"), StringLength(100, ErrorMessage = "Password cannot be longer than 100 characters")]
        public string Password { get; set; }
    
        [Compare("Password", ErrorMessage = "Passwords do not match")]
        [Required(ErrorMessage = "Please confirm Password")]
        public string RetypePassword { get; set; }
    
        [RegularExpression( "^[a-z0-9_\\+-]+(\\.[a-z0-9_\\+-]+)*@[a-z0-9-]+(\\.[a-z0-9]+)*\\.([a-z]{2,4})$" , ErrorMessage = "Invalid email format." )]
        [Required(ErrorMessage = "Please enter your e-mail address."), StringLength(50)]
        public string Email { get; set; }
    
        public List<NEWCategoryModel> Categories { get; set; }
        //public List<NEWPrivilegeModel> userPrivList { get; set; }
        public List<DropDownItem> ComplexList { get; set; }
        public List<DropDownItem> RoleList { get; set; }
        public string NewRole { get; set; }
    
        public NewModel()
        {
    
        }
    }
    

    输入的电子邮件地址存储在:

        public string Email { get; set; }
    

    我需要使用数据注释将该电子邮件地址与数据库中存储的所有电子邮件地址进行比较。我想我需要一个自定义数据注释?但我不知道该怎么做。

    这是从数据库中获取所有电子邮件地址的查询示例:

      db.ContactInformations.Where(x => x.EMail != null).Select(x => x.EMail);
    
    3 回复  |  直到 11 年前
        1
  •  5
  •   Hydro    11 年前
    public class NewModel 
    {
          [EmailValidation(ErrorMessage = "The Email Address already exists")]
          [RegularExpression( "^[a-z0-9_\\+-]+(\\.[a-z0-9_\\+-]+)*@[a-z0-9-]+(\\.[a-z0-9]+)*\\.([a-z]{2,4})$" , ErrorMessage = "Invalid email format." )]
          [Required(ErrorMessage = "Please enter your e-mail address."), StringLength(50)]
          public string Email { get; set; }
    {
    
    
    public class EmailValidation : ValidationAttribute
    {
    
        protected override ValidationResult IsValid(object value, ValidationContext validationContext)
        {
            PropmetEntities db = new PropmetEntities();
            if (value != null)
            {
                var valueAsString = value.ToString();
                IEnumerable<string> email = db.ContactInformations.Where(x => x.EMail != null).Select(x => x.EMail);
                if (email.Contains(valueAsString))
                {
                    var errorMessage = FormatErrorMessage(validationContext.DisplayName);
                    return new ValidationResult(errorMessage);
                }
            }
            return ValidationResult.Success;
        }
    }
    
        2
  •  1
  •   Jeyhun Rahimov    11 年前

    This 可以帮助您创建自定义验证。然后,要通过电子邮件检查数据库中是否已存在用户,请尝试:

    bool exist = db.UserTable.Any(e => e.Email.ToLower() == emailValue.ToLower());
    
        3
  •  1
  •   Community CDub    7 年前

    在里面 this post 您将找到一个利用 FluentValidation ,实现自定义DataAnnotation。

    您的独特电子邮件验证看起来大致如下:

    [Validator(typeof(NewModelValidator))]
    class NewModel
    {
        //...Model implementation omitted
    }
    
    public class NewModelValidator : AbstractValidator<NewModel>
    {
        public NewModelValidator()
        {
    
            RuleFor(x => x.Email).Must(IsUnieuqEmail).WithMessage("Email already exists");
        }
    
        private bool IsUniqueEmail(string mail)
        {
            var _db = new DataContext();
            if (_db.NewModel.SingleOrDefault(x => x.Email == mail) == null) return true;
            return false;
        }
    }