Asp.net mvc 4 不引人注目的验证不适用于动态内容

Asp.net mvc 4 不引人注目的验证不适用于动态内容,asp.net-mvc-4,unobtrusive-validation,Asp.net Mvc 4,Unobtrusive Validation,我在尝试使用通过AJAX调用动态加载的部分视图进行不引人注目的jquery验证时遇到了问题 我花了好几天的时间试图让这段代码在没有运气的情况下工作 以下是观点: @model MvcApplication2.Models.test @using (Html.BeginForm()) { @Html.ValidationSummary(true); <div id="res"></div> <input id="submit" type="submit" va

我在尝试使用通过AJAX调用动态加载的部分视图进行不引人注目的jquery验证时遇到了问题

我花了好几天的时间试图让这段代码在没有运气的情况下工作

以下是观点:

@model MvcApplication2.Models.test

@using (Html.BeginForm())
{
 @Html.ValidationSummary(true);
 <div id="res"></div>
 <input id="submit" type="submit" value="submit" />
}
控制员:

    public ActionResult GetView()
    {
        return PartialView("Test");
    }
最后,javascript:

$(doument).ready(function () {
$.ajax({
    url: '/test/getview',
    success: function (res) {

        $("#res").html(res);
        $.validator.unobtrusive.parse($("#res"));
    }
});

$("#submit").click(function () {
    if ($("form").valid()) {
        alert('valid');
        return true;
    } else {
        alert('not valid');
        return false;
    }
});
验证不起作用。即使我没有在文本框中填写任何信息,提交事件也会显示警报(“有效”)

但是,如果不是动态加载视图,而是使用
@Html.Partial(“test”,Model)
在主视图中呈现部分视图(我不做AJAX调用),那么验证工作就很好了

这可能是因为如果动态加载内容,DOM中还不存在控件。但是我调用了
$.validator.unobtrusive.parse($(“#res”)这应该足以让验证器了解新加载的控件


有人能帮忙吗

如果您试图解析已解析的表单,它将不会更新

将动态元素添加到表单时可以执行以下操作:

  • 您可以删除表单的验证并按如下方式重新验证:

    var form=$(formSelector)
    .removeData(“validator”)/*由原始jquery.validate插件添加*/
    .removeData(“不引人注目的验证”);/*由jquery unobtrusive插件添加*/
    $.validator.unobtrusive.parse(表单);
    
  • 使用jquery
    data
    方法访问表单的
    unobtrusiveValidation
    数据:

    $(表单).data('unobtrusiveValidation')
    
    然后访问规则集合并添加新元素属性(这有点复杂)


  • 您还可以在上查看这篇文章,以获取用于向表单添加动态元素的插件。此插件使用第二种解决方案。

    作为Nadeem Khedr答案的补充

    如果已将表单动态加载到DOM中,然后调用

    jQuery.validator.unobtrusive.parse(form); 
    
    (提到了额外的位),然后将使用ajax提交表单,记住调用

    $(form).valid()
    
    在提交表单之前,返回true或false(并运行实际验证)。

    测试:

    if ($.validator.unobtrusive != undefined) {
        $.validator.unobtrusive.parse("form");
    }
    

    将此添加到_Layout.cshtml

     $(function () {
            //parsing the unobtrusive attributes when we get content via ajax
            $(document).ajaxComplete(function () {
                $.validator.unobtrusive.parse(document);
            });
        });
    

    令人惊讶的是,当我查看这个问题时,官方ASP.NET文档仍然没有任何关于不引人注目的
    parse()
    方法的信息,也没有关于如何将其用于动态内容的信息。我在docs repo(参考@Nadeem的原始答案)上创建了一个请求,并提交了一个请求来修复它。这些信息现在可以在模型验证主题的一节中看到。

    我遇到了相同的问题,除此之外没有任何效果:

    $(document).ready(function () { 
        rebindvalidators();
    });
    
    function rebindvalidators() {
        var $form = $("#id-of-form");
        $form.unbind();
        $form.data("validator", null);
        $.validator.unobtrusive.parse($form);
        $form.validate($form.data("unobtrusiveValidation").options);
    }
    

    // Check if the form is valid
    var $form = $(this.form);
    if (!$form.valid())
        return;
    
    您试图保存表单的位置

    我通过Ajax调用保存表单


    希望这能对某人有所帮助。

    只需在模式代码末尾再次复制此代码即可

        <script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
    <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
    
    
    

    )()

    嗨,我也面临同样的问题。我在弹出窗口(jquery对话框)中显示我的动态视图。非结构化验证不起作用。在我的动态视图中,我在哪里调用$(form).valid(),或者在其他地方调用$(form).submit?我总是通过在$(form).submit中返回false来阻止表单提交,因为我正在执行AJAX提交,但是我需要一种在验证失败时不调用AJAX提交的方法$(form).valid()就是答案!非常感谢。老兄,你太棒了,完全救了我一天!真棒的回答!我害怕自己会邀请它。来自那个页面的脚本就像一个符咒。代码,效果很好-快速更新(如果我可以的话)1。我正在使用knockout并获得字段的名称,这看起来是个问题。validator.unobtrusive.parseDynamicContent('form');(以获取所有字段),在提交时结束。2.这很好地为您提供了一种命名字段的方法(这似乎是必需的?我在其他2个字段的顶部使用jquery非强制引导,因此我的情况可能不同)。请注意,您应用于
    $(“表单”).data(“validator”).settings
    的任何表单特定设置都将被
    $(formSelector)删除。removeData(“validator”)
    ,并在重新分析表单时替换为
    $.validator.defaults
    中的默认值。这是包含动态字段的好方法,但确保在每次新解析时重复任何自定义初始化代码。使用解决方案1)会导致表单和表单元素具有重复的事件侦听器(如onKeypUp)如果您尝试重置它并多次解析它(比如在我的例子中,它是通过JS添加/删除的动态内容)。有没有解除所有事件绑定并避免重复的提示?在jquery.validate 1.10上,较新版本有一种销毁方法,这种方法效率特别低。我也有同样的问题,但在mvc 2中。我一步一步地介绍:这可能对您也有帮助。希望此帮助:)注意,
    不引人注目。parse
    函数将选择器作为参数,不是元素。这一个对我有用。我从过去的许多天中找到了一个解决方案,它在asp.net core 2中有效。谢谢。
    // Check if the form is valid
    var $form = $(this.form);
    if (!$form.valid())
        return;
    
        <script src="~/Scripts/jquery.unobtrusive-ajax.min.js"></script>
    <script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>