Как удаленно проверить электронную почту или проверить, существует ли электронная почта

Я пытаюсь проверить, существует ли электронная почта при регистрации, чтобы в базе данных не было дубликатов электронной почты. Я делаю это с интернет-приложением MVC4 по умолчанию, но я добавил поле электронной почты в RegisterviewModel. Я также заметил, что это хорошо сделано с полем UserName, но я понятия не имею, как они это сделали. Я пытался следить за этим блогом ниже, но не повезло, так как я не отвечаю, когда нажимаю "Создать". Буксир Берк. Когда я использую Firebug, я получаю Status: 302 Found когда Json action excutes

Вот что у меня есть:

Профиль пользователя

[Table("UserProfile")]
public class UserProfile
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string UserName { get; set; }
    public string Email { get; set; }
}

RegisterViewModel

public class RegisterModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.EmailAddress)]
    [Display(Name = "Email")]
    [Remote("DoesUserEmailExist", "Account", HttpMethod = "POST", ErrorMessage = "Email address already exists. Please enter a different Email address.")]
    public string Email { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.",      MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [System.ComponentModel.DataAnnotations.Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }
}

Зарегистрировать действие

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
            try //CreateUserAndAccount
            {
                WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new { model.Email });
                WebSecurity.Login(model.UserName, model.Password);
                return RedirectToAction("Index", "Home");

            }
            catch (MembershipCreateUserException e)
            {
                ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

Json Action

[HttpPost]
    public JsonResult DoesUserEmailExist(string email)
    {

        var user = Membership.GetUserNameByEmail(email);

        return Json(user == null);
    }

Редактировать: Добавлено Регистрация Регистрация

     @model Soccer.Models.RegisterModel

     @{
     ViewBag.Title = "Register";
     }

     <hgroup class="title">
     <h1>@ViewBag.Title.</h1>
     <h2>Create a new account.</h2>
     </hgroup>

 @using (Html.BeginForm()) {
 @Html.AntiForgeryToken()
 @Html.ValidationSummary()

 <fieldset>
    <legend>Registration Form</legend>
    <ol>
        <li>
            @Html.LabelFor(m => m.UserName)
            @Html.TextBoxFor(m => m.UserName)
        </li>
        <li>
            @Html.LabelFor(m => m.Email)
            @Html.TextBoxFor(m => m.Email)
        </li>
        <li>
            @Html.LabelFor(m => m.Password)
            @Html.PasswordFor(m => m.Password)
        </li>
        <li>
            @Html.LabelFor(m => m.ConfirmPassword)
            @Html.PasswordFor(m => m.ConfirmPassword)
        </li>
    </ol>
    <input type="submit" value="Register" />
</fieldset>
 }

 @section Scripts {
 @Scripts.Render("~/bundles/jqueryval")
 }

Есть что-то, что я не должен делать, или есть еще один простой вариант, который я мог бы взять здесь?

2 ответа

Решение

Для JOBG я бы хотел поблагодарить JOBG за то, что он помог мне в этом. То, что я показал в вопросе выше, должно работать, если вы используете Database First так как он требует, чтобы вы установили столбец электронной почты UNIQUE в базе данных, однако, чтобы он работал с EF Code First я должен был сделать следующее для действия регистрации, также обратите внимание, что с этим решением вам не нужно Remote Annotation in the model:

Зарегистрировать действие

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public ActionResult Register(RegisterModel model)
    {
        if (ModelState.IsValid)
        {
            // Insert a new user into the database
            using (UsersContext db = new UsersContext())
            {
                UserProfile email = db.UserProfiles.FirstOrDefault(u => u.Email.ToLower() == model.Email.ToLower());
                try
                {
                    // Check if email already exists
                    if (email == null)
                    {
                        WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new { Email = model.Email });
                        WebSecurity.Login(model.UserName, model.Password);
                        return RedirectToAction("Index", "Home");
                    }
                    else
                    {
                        ModelState.AddModelError("Email", "Email address already exists. Please enter a different email address.");
                    }
                }
                catch (MembershipCreateUserException e)
                {

                    ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
                }
            }
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

Примечание. Обратите внимание, что это действие проверяет электронную почту перед именем пользователя и требует, чтобы вы по крайней мере один раз посетили базу данных перед созданием объекта.

Трудно сказать без кода View, но мой первый подозрение - js, убедитесь, что у вас установлен плагин проверки jQuery, он должен запустить проверку с .blur() событие, проверьте страницу с помощью firebug(или аналогичной) и найдите ajax POST, который ударил DoesUserEmailExist когда поле теряет фокус, если этого не происходит, то что-то отсутствует на стороне клиента, как Remote атрибут и сервис DoesUserEmailExist выглядит хорошо.

Примечание: убедитесь, что у вас есть UNIQUE ограничение в базе данных для поля электронной почты, это единственный реальный способ убедиться, что у вас нет повторяющихся электронных писем, даже с DoesUserEmailExist проверка из-за параллелизма.

Другие вопросы по тегам