验证不适用于通过Ajax动态加载的表单

时间:2012-01-09 15:22:06

标签: ajax asp.net-mvc-3 validation

在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);) 但是当它被禁用时我该怎么办?

2 个答案:

答案 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事件。