Сравните адрес электронной почты, введенный в базу данных, с DataAnnotations

У меня есть класс в моей модели в 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);

person Hydro    schedule 20.02.2014    source источник


Ответы (2)


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

bool exist = db.UserTable.Any(e => e.Email.ToLower() == emailValue.ToLower());
person Jeyhun Rahimov    schedule 20.02.2014
comment
Я отредактировал свой ответ, используя эту ссылку, добавив существующую логику в метод IsValid. - person Jeyhun Rahimov; 20.02.2014
comment
Этот .ToLower() создает новые строки и включает сборщик мусора. - person Mark Schultheiss; 01.05.2018

В этом сообщении вы найти решение, использующее FluentValidation, которое реализует пользовательскую аннотацию данных.

Ваша уникальная проверка электронной почты будет выглядеть примерно так:

[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;
    }
}
person Marco    schedule 20.02.2014