Validate.unobtrusive和Validate jQuery库
我正在构建一个MVC3应用程序,它使用标准模型验证属性进行基本的客户端和服务器验证。不过,我还有一个表单,它位于标题中,并使用jQuery验证插件执行客户端验证 当我将不引人注目的库添加到项目中时,使用validate插件的标题表单无法运行并继续发布。当不包括不引人注目的库时,标头将进行良好的验证,但随后模型验证将停止 知道我做错了什么吗 编辑 基本上,我在标题中有一个登录表单。我还有一个允许登录的登录页面。登录页面绑定到一个模型,但标题中的表单不是,它只是html。这两种表单都通过jQuery.ajax调用相同的控制器/操作 我已经失去了使用.ajax方法的能力,因为我包含了不引人注目的库,所以它似乎没有被调用 我得到了你包含的代码,但在验证完成后,我仍然无法发布或执行操作 我的页眉表格是:Validate.unobtrusive和Validate jQuery库,jquery,asp.net-mvc-3,Jquery,Asp.net Mvc 3,我正在构建一个MVC3应用程序,它使用标准模型验证属性进行基本的客户端和服务器验证。不过,我还有一个表单,它位于标题中,并使用jQuery验证插件执行客户端验证 当我将不引人注目的库添加到项目中时,使用validate插件的标题表单无法运行并继续发布。当不包括不引人注目的库时,标头将进行良好的验证,但随后模型验证将停止 知道我做错了什么吗 编辑 基本上,我在标题中有一个登录表单。我还有一个允许登录的登录页面。登录页面绑定到一个模型,但标题中的表单不是,它只是html。这两种表单都通过jQuery
<form id="frmHeaderLogin" action="">
<table id="LoginBox" title="Login">
<tr>
<td>UserName</td>
<td><input type="text" id="Username" name="Username" /></td>
</tr>
<tr>
<td>Password</td>
<td><input type="password" id="Password" name="Password" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="Login" id="btnHeaderLogin" name="btnHeaderLogin" /></td>
</tr>
</table>
</form>
如果要将Microsoft unobtrusive validation脚本与在同一页面中编写的自定义jquery验证规则混合使用,则需要将jquery验证规则添加到现有表单元素中。让我们举一个例子:
public class MyViewModel
{
[Required]
public string Foo { get; set; }
public string Bar { get; set; }
}
控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel());
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return View(model);
}
}
视图:
@model MyViewModel
$(函数(){
$('#Bar')。规则('添加'{
要求:正确,
信息:{
必选:'需要酒吧'
}
});
});
@使用(Html.BeginForm())
{
@EditorFor(x=>x.Foo)
@Html.ValidationMessageFor(x=>x.Foo)
@EditorFor(x=>x.Bar)
@Html.ValidationMessageFor(x=>x.Bar)
好啊
}
注意Foo字段上的Required属性是如何使其成为必需的,我们已经为Bar字段定义了一个自定义jquery验证规则
以下是提交表单时的结果,两个字段保留为空:
当然,您可以在任何字段上定义任意数量的自定义规则。Darin,我在标题中的表单不使用模型。它是一个标准HTML表单,有一个单击事件,调用jQuery验证,然后使用submitHandler发布。那还能用吗?正文中的表单具有相同的输入名称,但使用了一个模型。我没有尝试过,但我认为submitHandler可能无法工作,因为Ms unobtrusive已经劫持了提交处理程序。你能出示你的代码让我看到问题吗?另外,请将其缩小到最简单的示例。好的,您可以将
submitHandler
替换为submit
subscription,表单为:$('#formname').submit(函数(){if($(this.valid()){…将AJAX代码放在这里…}返回false;})代码>。就规则而言,你可以按照我的回答来定义它们。现在你可以摆脱.validate
调用了。嗨,达林,这就解决了问题。我还必须使用e.preventDefault()来防止出现默认的post。客户端和服务器验证现在可以工作了。
public class MyViewModel
{
[Required]
public string Foo { get; set; }
public string Bar { get; set; }
}
public class HomeController : Controller
{
public ActionResult Index()
{
return View(new MyViewModel());
}
[HttpPost]
public ActionResult Index(MyViewModel model)
{
return View(model);
}
}
@model MyViewModel
<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script type="text/javascript">
$(function () {
$('#Bar').rules('add', {
required: true,
messages: {
required: 'Bar is required'
}
});
});
</script>
@using (Html.BeginForm())
{
<div>
@Html.EditorFor(x => x.Foo)
@Html.ValidationMessageFor(x => x.Foo)
</div>
<div>
@Html.EditorFor(x => x.Bar)
@Html.ValidationMessageFor(x => x.Bar)
</div>
<button type="submit">OK</button>
}