2014-02-20 2 views
3

у меня есть класс, в моей модели в MVC:Сравнить E-mail адрес вводится в базу данных с DataAnnotations

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

Мне нужно сравнить этот адрес электронной почты ко всем адресам электронной почты, хранящимся в базе данных, с помощью аннотации данных. Я предполагаю, что мне понадобится аннотация для пользовательских данных? Но я понятия не имею, как это сделать.

Это пример запроса, чтобы получить Al адреса электронной почты из базы данных:

db.ContactInformations.Where(x => x.EMail != null).Select(x => x.EMail); 

ответ

5
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; 
    } 
} 
1

This может помочь вам создать пользовательскую проверку. Затем, чтобы проверить пользователь уже существует в базе данных по электронной почте, попробуйте:

bool exist = db.UserTable.Any(e => e.Email.ToLower() == emailValue.ToLower()); 
+0

Я отредактировал мой ответ, используя эту ссылку, добавить существует логику в IsValid метода там. –

1

В 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; 
    } 
} 
Смежные вопросы