在MVC 3.0中,当我禁用不引人注目的javascript:
<key="UnobtrusiveJavaScriptEnabled" value="false" />
如果我通过jQuery ajax加载表单,验证不起作用!实际上,以下代码返回null:
alert(Sys.Mvc.FormContext.getValidationForForm($(this).closest('form')[0]));
我知道启用unobtrusive时的解决方案(通过调用$ .validator.unobtrusive.parse(id);) 但是当它被禁用时我该怎么办?
答案 0 :(得分:1)
确保您也调用了Sys.Mvc.FormContext._Application_Load();
。
我们举一个例子。
查看型号:
public class MyViewModel
{
[Required]
public string Foo { get; set; }
}
控制器:
public class HomeController : Controller
{
public ActionResult Index()
{
return View();
}
public ActionResult Create()
{
return PartialView(new MyViewModel());
}
[HttpPost]
public ActionResult Create(MyViewModel model)
{
return Content("thanks for submitting");
}
}
查看(Index.cshtml
):
<script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/MicrosoftMvcValidation.js")" type="text/javascript"></script>
<script type="text/javascript">
$.get('@Url.Action("create")', function (result) {
$('#foo').html(result);
// That's the important bit that you were probably missing
Sys.Mvc.FormContext._Application_Load();
$('form').submit(function () {
if (Sys.Mvc.FormContext.getValidationForForm(this).validate('submit').length > 0) {
return false;
}
});
});
</script>
<div id="foo"></div>
部分包含动态加载的表单(Create.cshtml
):
@model MyViewModel
@{Html.EnableClientValidation(true);}
@using (Html.BeginForm())
{
@Html.LabelFor(x => x.Foo)
@Html.EditorFor(x => x.Foo)
@Html.ValidationMessageFor(x => x.Foo)
<button type="submit">OK</button>
}
备注:显然,只有当你想使用完全过时的Microsoft*.js
脚本而不是推荐的jQuery unobtrusive和jQuery验证插件时,这个答案才有效。因此,只有在web.config中设置<add key="UnobtrusiveJavaScriptEnabled" value="false"/>
时才有效。
答案 1 :(得分:0)
我不知道为什么你只想手动关闭验证。 无论如何,你的问题是当你关闭不引人注目的验证时,asp.net助手不会输出验证函数使用的数据属性。
我的建议是离开<key="UnobtrusiveJavaScriptEnabled" value="false" />
并取消注册jQuery事件。