我的标记中有一个字段,我想对服务器进行验证。我的表单目前看起来像这样:
<% 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 返回 JsonResult ,但无济于事。
我在这里做错了什么?
答案 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解决了这个问题。