Как удаленно проверить электронную почту или проверить, существует ли электронная почта
Я пытаюсь проверить, существует ли электронная почта при регистрации, чтобы в базе данных не было дубликатов электронной почты. Я делаю это с интернет-приложением 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
проверка из-за параллелизма.