Сбой правила удаленной проверки для проверки JQuery (с использованием MVC 2) - PullRequest
2 голосов
/ 15 апреля 2011

В моей разметке есть поле, которое я хочу проверить на сервере. Моя форма в настоящее время выглядит так:

<% using (Html.BeginForm()){ %>
  <%: Html.Serialize("regData", Model)%>
  <div class="RegistrationGroup">
    <p><label for="Account_Email">e-mail</label> <%: Html.EditorFor(x => x.Account.Email) %><span class="ErrorMessage"></span></p>
  </div>
<% } %>

Тогда в моем скрипте jQuery у меня есть следующий код:

$("form").validate({
  rules: {
    "Account.Email": {
      required: true,
      email: true
      remote: "Registration/ValidateEmail"
    }
  }
});

В моем классе RegistrationController у меня есть следующий метод:

public string ValidateEmail(string email)
{
  if (email.Contains("oek"))
    return "false";
  return "true";
}

Таким образом, для тестирования это должно возвращать false и проваливать проверку, если адрес электронной почты где-то внутри "oek".

Однако это не работает.

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

Когда я добавляю удаленное правило, выполняются следующие шаги:

  • Метод на контроллере вызывается, как и планировалось, с адресом электронной почты в качестве параметра.
  • Возвращаемое значение из метода, которое оно перехватило в браузере как true или false соответственно (я использовал инструменты разработчика Chrome для управления этим).

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

Я также пытался вернуть JsonResult с true или false , но безрезультатно.

Что я здесь не так делаю?

Ответы [ 2 ]

2 голосов
/ 15 апреля 2011
public ActionResult ValidateEmail(string email)
{
    if ((email ?? string.Empty).Contains("oek"))
    {
        return Json(false, JsonRequestBehavior.AllowGet);
    }
    return Json(true, JsonRequestBehavior.AllowGet);
}

также вы пропускаете запятую после правила email: true:

$('form').validate({
    rules: {
        'Account.Email': {
            required: true,
            email: true,
            remote: '@Url.Action("ValidateEmail", "Registration")'
        }
    }
});

или, если это отдельный файл javascript, вы можете использовать атрибуты HTML5 data-* в поле электронной почты:

$('form').validate({
    rules: {
        'Account.Email': {
            required: true,
            email: true,
            remote: $('#Account_Email').data('remote-val-url')
        }
    }
});

ОБНОВЛЕНИЕ:

Полный рабочий пример.Убедитесь, что параметр действия электронной почты правильно связан в действии ValidateEmail.

Модель:

public class MyViewModel
{
    public MyViewModel()
    {
        Account = new Account();
    }
    public Account Account { get; set; }
}

public class Account
{
    public string Email { get; set; }
}

Контроллер:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }

    public ActionResult ValidateEmail(Account account)
    {
        if ((account.Email ?? string.Empty).Contains("oek"))
        {
            return Json(false, JsonRequestBehavior.AllowGet);
        }
        return Json(true, JsonRequestBehavior.AllowGet);
    }
}

Представление:

<script src="<%= Url.Content("~/Scripts/jquery.validate.js") %>" type="text/javascript"></script>

<% using (Html.BeginForm()) { %>
    <label for="Account_Email">e-mail</label> 
    <%= Html.EditorFor(x => x.Account.Email) %>
    <span class="ErrorMessage"></span>
<% } %>


<script type="text/javascript">
    $('form').validate({
        rules: {
            'Account.Email': {
                required: true,
                email: true,
                remote: '<%= Url.Action("ValidateEmail", "Home") %>'
            }
        }
    });
</script>
0 голосов
/ 17 апреля 2011

Я наконец нашел здесь ответ, и это был не мой код, который был неправильным, а версия плагина jQuery.Validate .

Я использовал плагин Validate, поставляемый с Visual Studio 2010 , и я обновил jQuery с версии 1.4.1 до 1.5.1 в том же проекте.Проблема заключается в том, что подключаемый модуль Validate, поставляемый с Visual Studio 2010 (версия 1.6), не совместим с jQuery 1.5.1 .В основном это так, но не функциональность на основе Ajax.

Таким образом, обновление jQuery.Validate до 1.8 решило проблему.

...