【问题标题】:unobtrusive validation not working with dynamic content不显眼的验证不适用于动态内容
【发布时间】:2013-02-15 20:11:26
【问题描述】:

我在尝试让不显眼的 jquery 验证与通过 AJAX 调用动态加载的局部视图一起工作时遇到问题。

我花了几天时间试图让这段代码正常工作,但没有成功。

这是视图:

@model MvcApplication2.Models.test

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

局部视图:

@model MvcApplication2.Models.test

@Html.TextAreaFor(m => m.MyProperty);
@Html.ValidationMessageFor(m => m.MyProperty);

<script type="text/javascript" >
  $.validator.unobtrusive.parse(document);
</script>

模型:

  public class test
  {
    [Required(ErrorMessage= "required field")]
    public int MyProperty { get; set; }
  }

控制器:

    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;
    }
});

验证不起作用。即使我没有在 texbox 中填写任何信息,提交事件也会显示警报(“有效”)。

但是,如果不是动态加载视图,而是使用@Html.Partial("test", Model) 在主视图中呈现部分视图(并且我不执行 AJAX 调用),那么验证就可以正常工作。

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

谁能帮忙?

【问题讨论】:

标签: asp.net-mvc-4 unobtrusive-validation


【解决方案1】:

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

当你在表单中添加动态元素时,你可以做的是

  1. 您可以删除表单的验证并像这样重新验证它:

    var form = $(formSelector)
        .removeData("validator") /* added by the raw jquery.validate plugin */
        .removeData("unobtrusiveValidation");  /* added by the jquery unobtrusive plugin*/
    
    $.validator.unobtrusive.parse(form);
    
  2. 使用 jquery data 方法访问表单的unobtrusiveValidation 数据:

    $(form).data('unobtrusiveValidation')
    

    然后访问规则集合并添加新元素属性(这有点复杂)。

您还可以查看Applying unobtrusive jquery validation to dynamic content in ASP.Net MVC 上的这篇文章,了解用于向表单添加动态元素的插件。本插件采用第二种方案。

【讨论】:

  • 老兄,你摇滚,完全拯救了我的一天!很棒的答案!
  • 我怕自己请来。该页面的脚本就像一个魅力。
  • 代码,效果很好 - 快速更新(如果可以的话) 1. 我正在使用淘汰赛并很好地获取字段的名称,所以它看起来像一个问题。 $.validator.unobtrusive.parseDynamicContent('form'); (获取所有字段),最后提交时。 2.这很好johnnyreilly.github.io/jQuery.Validation.Unobtrusive.Native/…给你一种命名字段的方法(这似乎是必需的?我在其他两个之上使用jquery unbtrusive bootstrap,所以我的情况可能不同)
  • 请注意,您应用于$("form").data("validator").settings 的任何特定于表单的设置都将被$(formSelector).removeData("validator") 删除,并在重新解析表单时替换为$.validator.defaults 的默认设置。这是包含动态字段的好方法,但请确保在每次新解析时重复任何自定义初始化代码。
  • 使用解决方案 1) 如果您尝试重置它并多次解析它(例如在我的情况下通过JS)。有什么技巧可以解除所有事件的绑定并避免这种重复?在 jquery.validate 1.10 上,较新的版本有一个 destroy 方法
【解决方案2】:

作为对 Nadeem Khedr 回答的补充......

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

jQuery.validator.unobtrusive.parse(form); 

(提到了额外的部分)然后将使用 ajax 提交该表单,记得调用

$(form).valid()

在您提交表单之前返回 true 或 false(并运行实际验证)。

【讨论】:

  • 嗨,我面临同样的问题。我在弹出窗口中显示我的动态视图(jquery 对话框)。不显眼的验证不起作用。在我的动态视图或其他地方我应该在哪里调用 $(form).valid()?
  • 我总是通过在 $(form).submit 中返回 false 来阻止表单提交,因为我正在执行 AJAX 提交,但是我需要一种在验证失败时不调用 AJAX 提交的方法。 $(form).valid() 就是答案!谢谢!
【解决方案3】:

令人惊讶的是,当我查看这个问题时,ASP.NET 官方文档仍然没有任何关于不显眼的 parse() 方法或如何将其与动态内容一起使用的信息。我冒昧地在文档存储库中创建了一个issue(参考@Nadeem 的原始答案)并提交了一个拉取请求来修复它。此信息现在在模型验证主题的client side validation 部分中可见。

【讨论】:

    【解决方案4】:

    将此添加到您的 _Layout.cshtml

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

    【讨论】:

    • 这个效率特别低。
    【解决方案5】:

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

    $(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 调用保存表单。

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

    【讨论】:

    • 这个对我有用。我一直在寻找过去很多天的解决方案,它适用于 asp.net core 2。谢谢。
    【解决方案6】:

    测试一下:

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

    【讨论】:

      【解决方案7】:

      只需在模态代码末尾再次复制此代码

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

      ;)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-08
        • 2015-04-05
        • 2015-03-27
        • 1970-01-01
        • 1970-01-01
        • 2013-09-21
        相关资源
        最近更新 更多