我的布局页面包含所有脚本,如下所示。
<!DOCTYPE html>
<html lang="en">
<head>
<title>My Site</title>
<link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<some custom css>
<modernizr>
<script src="~/Scripts/Jquery/jquery-1.9.1.js"></script>
<script src="~/Scripts/Jquery/jquery-ui-1.10.2.js"></script>
<script src="~/Scripts/Jquery/jquery.unobtrusive-ajax.js"></script>
<script src="~/Scripts/Jquery/jquery.validate.js"></script>
<script src="~/Scripts/Jquery/jquery.validate.unobtrusive.js"></script>
<some custom scripts>
<bootstrap scripts>
<knockout scripts>
</head>
<body>
@RenderBody()
</body>
</html>
然后我的注册表格如图所示
@model Mysite.Models.Account.Account
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "register" }))
{
@Html.AntiForgeryToken();
<h1>Login</h1>
@Html.ValidationSummary();
@Html.EditorFor(m => m.Name)
@Html.EditorFor(m => m.Address1)
@Html.EditorFor(m => m.Address2)
@Html.EditorFor(m => m.Phone1)
<input type="button" value="Register" id="btn1" />
}
<script>
var form = $("#register");
$("#btn1").click(function (e) {
e.preventDefault();
$.ajax({
url: 'http://localhost:3885/Account/Register',
data: form.serialize(),
type: 'POST',
success: function (result) {},
error: function (req, status, error) {
function(req, status, error);
}
});
});
</script>
我的帐户模型类如下:
public class Account
{
public Name name {get; set;}
public Address Address1 {get; set;}
public Address Address2 {get; set;}
public Phone Phone1 {get;set;}
}
其中每个Property也是一个带有自己的EditorTemplates的模型类,例如
public class Name
{
[Required]
public string FirstName {get; set;}
public string MiddleName {get; set;}
[Required]
public string LastName {get; set;}
}
并且Name.cshtml EditorTemplate如下所示
<div >
@Html.TextBoxFor(m=>m.FirstName);
@Html.TextBoxFor(m=>m.MiddleName);
@Html.TextBoxFor(m=>m.LastName);
<div>
类似于Address.cshtml和Phone.cshtml
web.config中的: -
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
单击空表单上的“注册”按钮,它会向注册[HttpPost]控制器方法执行ajax发布。为什么它不给我客户端验证消息我认为它叫做Unobtrusive验证?我也没有在控制台中看到任何错误。
答案 0 :(得分:20)
提交按钮必须是“submit”类型才能触发jquery验证验证,无论是单独使用jquery插件还是使用不显眼的插件。
所以这会触发验证:
<input type="submit" value="Register" id="btn1" />
但是看到你已经编写了一些代码来处理按钮点击,可能更容易手动触发验证
$("#btn1").click(function (e) {
e.preventDefault();
// now trigger the form validation, result is 1 or 0
var result = $('form').valid();
$.ajax(
// details omitted
);
});
答案 1 :(得分:3)
我认为您需要重新排序脚本引用
<script src="~/Scripts/Jquery/jquery-1.9.1.js"></script>
<script src="~/Scripts/Jquery/jquery-ui-1.10.2.js"></script>
<script src="~/Scripts/Jquery/jquery.validate.js"></script>
<script src="~/Scripts/Jquery/jquery.validate.unobtrusive.js"></script>
<script src="~/Scripts/Jquery/jquery.unobtrusive-ajax.js"></script>
答案 2 :(得分:0)
如果您正在使用_Layout.cshtml删除以下参考
@Scripts.Render("~/bundles/jquery")
在底部
对我有用!
答案 3 :(得分:0)
我也有类似的问题,需要几周的时间来调试。 我在使用aspx页面。
根本原因是 Html.BeginForm
声明放在<table>
代码之后。
<table>
<% using (Html.BeginForm("ContainerManagement", "Admin", FormMethod.Post)){%>
</table>
这导致<form>
标记在任何<input>
标记之前关闭,因此不显眼的客户端验证无效。
<form action="/Admin/ContainerManagement" method="post" novalidate="novalidate"></form>
<tr>
<td><input></td>
</tr>
所以,请务必在<{strong> Html.BeginForm
代码
<table>
<% using (Html.BeginForm("ContainerManagement", "Admin", FormMethod.Post)){%>
<table>...</table>
<% } %>
答案 4 :(得分:0)
我有同样的问题,发现如果我打电话 &#39; element.valid()&#39; 在库调用验证函数发生之前,它将不再验证我的表单。我通过创建一个扩展来解决这个问题,该扩展程序验证表单是否已被处理,只是验证元素是否有效
$.fn.revalidate = function () {
if (this.length) {
var validator = this.closest("form").data("validator");
if (validator)
validator.element(this);
}
return this;
};
答案 5 :(得分:-1)
您还需要添加错误消息
@Html.EditorFor(m => m.Name)
@Html.ValidationMessageFor(m => m.Name)
@Html.EditorFor(m => m.Address1)
@Html.ValidationMessageFor(m => m.Address1)
@Html.EditorFor(m => m.Address2)
@Html.ValidationMessageFor(m => m.Address2)
@Html.EditorFor(m => m.Phone1)
@Html.ValidationMessageFor(m => m.Phone1)