动态添加字段的客户端验证

Muh*_*hid 20 asp.net-mvc jquery unobtrusive-validation asp.net-mvc-3

我在ASP.NET MVC中使用jQuery的不显眼的验证插件.正确验证在服务器上呈现的任何字段.

但是,如果我使用JavaScript在表单中动态添加字段,即使它具有相应的HTML5 data-*属性,也不会验证它.

任何人都可以指导我如何实现这一目标吗?

Sun*_*abu 19

更简单的答案:

我正在使用MVC 4和JQuery 1.8.我已经使它成为一个模块化函数,它接受新添加元素的jQuery对象:

function fnValidateDynamicContent($element) {
    var $currForm = $element.closest("form");
    $currForm.removeData("validator");
    $currForm.removeData("unobtrusiveValidation");
    $.validator.unobtrusive.parse($currForm);
    $currForm.validate(); // This line is important and added for client side validation to trigger, without this it didn't fire client side errors.
}
Run Code Online (Sandbox Code Playgroud)

例如,如果您添加了一个带有id的新表tblContacts,那么您可以像这样调用:

fnValidateDynamicContent($("#tblContacts"))
Run Code Online (Sandbox Code Playgroud)


Dar*_*rov 12

这是一篇你可能觉得有用的博客文章,应该会让你走上正轨.从那里采取的扩展方法:

/// <reference path="jquery-1.4.4.js" />
/// <reference path="jquery.validate.js" />
/// <reference path="jquery.validate.unobtrusive.js" />

(function ($) {
  $.validator.unobtrusive.parseDynamicContent = function (selector) {
    //use the normal unobstrusive.parse method
    $.validator.unobtrusive.parse(selector);

    //get the relevant form
    var form = $(selector).first().closest('form');

    //get the collections of unobstrusive validators, and jquery validators
    //and compare the two
    var unobtrusiveValidation = form.data('unobtrusiveValidation');
    var validator = form.validate();

    $.each(unobtrusiveValidation.options.rules, function (elname, elrules) {
      if (validator.settings.rules[elname] == undefined) {
        var args = {};
        $.extend(args, elrules);
        args.messages = unobtrusiveValidation.options.messages[elname];
        $('[name="' + elname + '"]').rules("add", args);
      } else {
        $.each(elrules, function (rulename, data) {
          if (validator.settings.rules[elname][rulename] == undefined) {
            var args = {};
            args[rulename] = data;
            args.messages = unobtrusiveValidation.options.messages[elname][rulename];
            $('[name="' + elname + '"]').rules("add", args);
          }
        });
      }
    });
  }
})($);
Run Code Online (Sandbox Code Playgroud)

然后:

var html = "<input data-val='true' "+
           "data-val-required='This field is required' " +
           "name='inputFieldName' id='inputFieldId' type='text'/>;
$("form").append(html);

$.validator.unobtrusive.parseDynamicContent('form input:last');
Run Code Online (Sandbox Code Playgroud)

更新以添加博客帖子评论中引用的修复,否则会发生js错误.


Muh*_*hid 10

为了让Darin的答案奏效,我更改了以下内容:

$.validator.unobtrusive.parse(selector); 
Run Code Online (Sandbox Code Playgroud)

对此:

 $(selector).find('*[data-val = true]').each(function(){
    $.validator.unobtrusive.parseElement(this,false);
 });
Run Code Online (Sandbox Code Playgroud)

这是完整的样本:

(function ($) {
  $.validator.unobtrusive.parseDynamicContent = function (selector) {
    // don't use the normal unobstrusive.parse method
    // $.validator.unobtrusive.parse(selector); 

     // use this instead:
     $(selector).find('*[data-val = true]').each(function(){
        $.validator.unobtrusive.parseElement(this,false);
     });
    
    //get the relevant form
    var form = $(selector).first().closest('form');

    //get the collections of unobstrusive validators, and jquery validators
    //and compare the two
    var unobtrusiveValidation = form.data('unobtrusiveValidation');
    var validator = form.validate();

    $.each(unobtrusiveValidation.options.rules, function (elname, elrules) {
      if (validator.settings.rules[elname] == undefined) {
        var args = {};
        $.extend(args, elrules);
        args.messages = unobtrusiveValidation.options.messages[elname];
        $('[name="' + elname + '"]').rules("add", args);
      } else {
        $.each(elrules, function (rulename, data) {
          if (validator.settings.rules[elname][rulename] == undefined) {
            var args = {};
            args[rulename] = data;
            args.messages = unobtrusiveValidation.options.messages[elname][rulename];
            $('[name="' + elname + '"]').rules("add", args);
          }
        });
      }
    });
  }
})($);
Run Code Online (Sandbox Code Playgroud)

$.validator.unobtrusive.parse在内部调用parseElement方法,但每次isSkip使用此值将参数发送到true时

if (!skipAttach) {
    valInfo.attachValidation();
}
Run Code Online (Sandbox Code Playgroud)

jquery.unobtrusive.js中的此代码不会将验证附加到元素,我们只查找最初出现在页面上的输入的验证数据.

注意 Darin上面的答案是正确的,你可以在他提到的博客上找到许多人使用xhalent的代码解决了问题(由darin发布).为什么它不起作用超出了我的理解.此外,你可以找到很多帖子告诉你只是打电话

$.validator.unobtrusive.parse(selector) 
Run Code Online (Sandbox Code Playgroud)

足以使动态加载的内容得到验证

  • $ .validator.unobtrusive.parse(selector)仅适用于新添加的表单.如果您已有一个现有表单并向该表单插入新输入字段,则它将不起作用. (2认同)