2014-02-05 1 views
1

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

Это часть моего RegisterModel:

[Required()] 
    [System.Web.Mvc.Remote("IsUserEmailAvailable", "Account")] 
    [EmailAddress()] 
    [DataType(DataType.EmailAddress)] 
    [Display(Name = "Email")] 
    public string Email { get; set; } 

..

Это часть моего AccountController:

public JsonResult IsUserEmailAvailable(string UserEmail) 
    { 
     return Json(!db.UserProfiles.Any(User => User.UserName == UserEmail),  JsonRequestBehavior.AllowGet); 
    } 

Это мое мое мнение:

<script src="~/Scripts/jquery-1.7.1.min.js" type="text/javascript"></script> 
<script src="~/Scripts/jquery.validate.min.js" type="text/javascript"></script> 
<script src="~/Scripts/jquery.validate.unobtrusive.min.js" type="text/javascript"></script> 


<hgroup class="title"> 
    <h1>Create Account</h1> 
</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.Password) 
       @Html.PasswordFor(m => m.Password) 
      </li> 
      <li> 
       @Html.LabelFor(m => m.ConfirmPassword) 
       @Html.PasswordFor(m => m.ConfirmPassword) 
      </li> 
      <li> 
       @Html.LabelFor(m => m.Email) 
       @Html.TextBoxFor(m => m.Email) 
      </li> 
      <li> 
       @Html.LabelFor(m => m.ConfirmEmail) 
       @Html.TextBoxFor(m => m.ConfirmEmail) 
      </li> 
     </ol> 
     <input type="submit" value="Registrera" /> 
    </fieldset> 
} 

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

Если я удалю [System.Web.Mvc.Remote («IsUserEmailAvailable», «Account»)] все отлично, за исключением того, что адрес электронной почты не будет уникальным. При этом, когда я нажимаю кнопку «Отправить», ничего не происходит.

Пропустил ли я что-нибудь?

+1

Вы можете показать свой просмотр? а может быть вы пропустили показ проверки ошибок Html.ValidationMessageFor –

+0

Отредактированный мой пост :) – Reft

+1

Попробуйте добавить html.ValidationMesageFor ваш адрес электронной –

ответ

0

@ Daniel J.G. верно.Добавление функции [AllowAnonymous] к функции делает ее доступной.

+0

Да, спасибо, господин, он работает сейчас. глупый я. У меня был глобальный фильтр, filters.Add (новый System.Web.Mvc.AuthorizeAttribute()); – Reft

0

Атрибут [Remote] весьма ограничен и требует, чтобы имя свойства было таким же, как имя параметра в действии контроллера.

  • Ваше свойство называется Email как в public string Email { get; set; }

  • Вашего действия имеет параметр с именем UserEmail как в IsUserEmailAvailable(string UserEmail)

Это не будет работать, так как удаленная проверка будет в конечном итоге отправив запрос на проверку, как:

Account/IsUserEmailAvailable?Email=foo 

Адрес Email - название объекта. Фактически, это атрибут name отображаемого поля ввода html. Это может быть проблемой для вложенных моделей, где имя будет чем-то вроде NestedModel.Email, но, к счастью, это не ваш случай. (См, например this question)

Таким образом, ваш метод проверки принимает USEREMAIL в нуль (поскольку запрос содержит один параметр с именем Email), который может быть причиной запроса на провал. (? Вы проверили консоль в вашем браузере, чтобы увидеть, если Ajax запрос не удалось)

Поскольку оба названия должны соответствовать, вы могли бы обновить действие контроллера, поэтому параметр называется Email:

public JsonResult IsUserEmailAvailable(string Email) 
{ 
    ... 
} 

Надеюсь, поможет!

+0

я редактировал мое действие: \t общественного JsonResult IsUserEmailAvailable (строка E-mail) { возврата Json (дБ .UserProfiles.Any (User => User.Email == Email), JsonRequestBehavior.AllowGet); } \t То же самое здесь, ничего не происходит. \t Также он ничего не говорит о запросе ajax, все пусто. – Reft

+0

Это из вкладки сети в хроме: \t Расположение: /Account/Login?ReturnUrl=%2fAccount%2fIsEmailAvailable%3fEmail%3dmyslex%2540gmail.com&Email=myslex%40gmail.com \t [18:36:12] \t URL запроса: HTTP: // локальный: 60576/Account/IsEmailAvailable Email = myslex% 40gmail.com Метод \t запрос: GET \t Status Code: 302 Найдено – Reft

+0

Кроме того, в моем AccountModel я не мог включать в себя пространство имен с использованием системы .Web.Mvc; \t Мои атрибуты [Compare] на моих других линиях покраснели, и он сказал, что «пространство имен не может быть найдено blablabla», поэтому я включил его, как вы видите сейчас, в одной строке перед удаленным атрибутом. \t Спасибо за вашу помощь – Reft

0

Вы можете настроить действие контроллера MVC и использовать jquery для запроса его на лету. Вот статья, которая объясняет, как это сделать (будьте уверены, что это для авто-полного текстового поля, но теория такая же): How Do I Create an Auto-Complete TextBox?

Мне было бы очень интересно увидеть решение, которое вы придумали для выполнения этого задача.