Compare email address entered into database using DataAnnotations

I have a class in my model in 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()
    {

    }
}

The entered email address is stored in:

    public string Email { get; set; }

I need to compare this email address with all email addresses stored in the database using Data Annotation. I assume that I will need annotation for user data? But I do not know how to do this.

This is a sample request to retrieve email addresses from a database:

  db.ContactInformations.Where(x => x.EMail != null).Select(x => x.EMail);
+3
source share
3 answers
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;
    }
}
+5
source
+1

In this post, you will find a solution using FluentValidation that implements custom DataAnnotation.

Your unique email check will look something like this:

[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;
    }
}
+1
source

All Articles