不引人注意的"忽视"设置不起作用

时间:2016-02-18 13:13:45

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

这是一个奇怪的事情。关于为不引人注意的验证ignore对象设置settings属性,有很多关于SO的问题。

场景:我有一个通过迭代MVC中的模型生成的表,我通过在服务器端插入一个空白模型自动填充底部的空行(它是需求的一部分,非-negotiable)。如果用户没有触摸它,我不想验证这个空白行,但是如果有的话,我会这样做。

为了解决这个问题,我正常生成表格。使用jquery,我使用" blank"类自动标记任何空白行。通过查看源代码,我只能看到表格中的空白行。

现在,如果在客户端上的document.read()调用中,我有;

$.validator.unobtrusive.parse('form');
var form = $('form').get(0);
var settings = $.data(form, 'validator').settings;
settings.ignore = ':hidden,.blank';

这很好用。即使我添加新行,点击提交也不会触发空行验证。但是,验证不会在除第一行之外的任何填充行上发生。

为了解决这个问题,我创建了一个函数reattachValidation(),只要我添加一个新行就会调用它,以便验证将触发新行。代码被修改为:

function reattachValidation() {
    var forms = $('form');
    forms.removeData('validator');
    forms.removeData('unobtrusiveValidation');

    $.validator.unobtrusive.parse('form');
    var form = $('form').get(0);
    var settings = $.data(form, 'validator').settings;
    settings.ignore = ':hidden,.blank';
}

现在上面的代码将验证动态添加到表中的所有新行,但也将验证仍然具有"空白"类的空白行。关于相关要素。所以我可以不验证空行而不是新行或者我可以验证所有行,包括标有"空白"

的元素。

如何在使用用户数据验证新行的同时忽略空白行?

2 个答案:

答案 0 :(得分:1)

您只需在SO上其他地方记录的原始标准方式中添加一行即可获得忽略效果。这涉及到使用jquery .off()删除绑定到表单的提交事件。之所以需要这样做,是因为验证器对象的先前实例必须提交事件,而由于javascript闭包的工作方式,它们没有被更新。

$("form").removeData("validator");
$("form").removeData("unobtrusiveValidation");
$("form").off("submit.validate"); //new line

$.validator.unobtrusive.parse("form");

$("form").validate().settings.ignore = ":hidden, .blank";

答案 1 :(得分:0)

我最终做到了这一点。

在javascript中;

$(function() {
    $.validator.unobtrusive.parse("form");
    var form = $("form").get(0);
    var settings = $.data(form, "validator").settings;
    settings.ignore = ":hidden,.blank";
});

// This function will attach any dynamic entity (e.g., a new row in a grid) to the
// MVC unobtrusive validator to be validated at the appropriate time.
// Usage:    $.validator.unobtrusive.parseDynamicContent(newTableRow);
(function ($) {
    $.validator.unobtrusive.parseDynamicContent = function (selector) {
        //use the normal unobstrusive.parse method
        $.validator.unobtrusive.parse(selector);

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

        //get the collections of unobtrusive 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];
                //edit:use quoted strings for the name selector
                $("[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];
                        //edit:use quoted strings for the name selector
                        $("[name='" + elname + "']").rules("add", args);
                    }
                });
            }
        });
    }
})($);

然后在添加新的动态元素时,这样就完成了(动画是不必要的,但是对parseDynamicContent()的调用是;

selectedTableRow.after(newTableRow);
newTableRow.fadeIn(500, function () {
    // reattach the MVC validation after adding a new row so that we get our client
    // side validation on the data annotations.
    // NOTE: we do this AFTER the fade in animation as by default the validator will
    //       not hook into any hidden elements - which our row is until the animation
    //       completes.
    $.validator.unobtrusive.parseDynamicContent(newTableRow);
});