JQuery验证的远程验证规则失败(使用MVC 2)

时间:2011-04-15 13:26:25

标签: asp.net-mvc-2 jquery jquery-validate

我的标记中有一个字段,我想对服务器进行验证。我的表单目前看起来像这样:

<% 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的开发人员工具来控制它)。

但此时验证无法按计划运行,并且在远程调用完成后,所需的电子邮件规则也将停止工作。 (在其他规则通过验证之前,它不会尝试强制执行远程规则,这当然是件好事。)

我还尝试使用 true false 返回 JsonResult ,但无济于事。

我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

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>

答案 1 :(得分:0)

我终于找到了答案,并不是我的代码错了,而是 jQuery.Validate 插件版本。

我使用了 Visual Studio 2010 附带的Validate插件,并且我已在同一个项目中将 jQuery 从版本1.4.1升级到1.5.1。问题是 Visual Studio 2010 (版本1.6)附带的Validate插件与 jQuery 1.5.1 不兼容。它主要是,但不是基于Ajax的功能。

所以将 jQuery.Validate 更新为1.8解决了这个问题。