jQuery验证插件-防止重复错误消息

jQuery验证插件-防止重复错误消息,jquery,validation,jquery-validate,Jquery,Validation,Jquery Validate,我有一条规定,在每个阶段,选择的总数量必须等于预订的乘客数量。每个阶段在DIV中定义,如本例所示:- HTML <div id="Stage_1"> <select data-stage="1" id="Quantity1" name="Items[1].Quantity">...</select> <select data-stage="1" id="Quantity2" name="Items[2].Quantity">...&

我有一条规定,在每个阶段,选择的总数量必须等于预订的乘客数量。每个阶段在DIV中定义,如本例所示:-

HTML

<div id="Stage_1">
    <select data-stage="1" id="Quantity1" name="Items[1].Quantity">...</select>
    <select data-stage="1" id="Quantity2" name="Items[2].Quantity">...</select>
    <select data-stage="1" id="Quantity3" name="Items[3].Quantity">...</select>
</div>
<div id="Stage_2">
    <select data-stage="2" id="Quantity4" name="Items[4].Quantity">...</select>
    <select data-stage="2" id="Quantity5" name="Items[5].Quantity">...</select>
</div>
问题

我有以下问题:-

  • 页面上的每个下拉列表都会显示错误消息。例如,如果说“阶段1错误阶段1错误阶段1错误阶段2错误阶段2错误”。如果阶段1和阶段2无效,则应仅显示“阶段1错误阶段2错误”

  • 如您所见,规则是硬编码的。我确实尝试创建一个函数(见下文)来动态创建规则,但我不知道如何应用它。如果我尝试执行规则:{GetRules()},那么我只会得到一个错误,说“预期的:”


  • 我自己想出来的。我需要对验证器上的控件进行分组。一旦这样做了,我就能够在一个单独的容器中显示每个阶段的错误。组和规则是动态创建的,如下所示

    var validation =
    {
        errorContainer: "#ValidationSummary",
        errorLabelContainer: "#ValidationSummary",
        groups: {}, rules: {}, messages: {}
    };
    
    jQuery('div[id*="Stage_"]').each(function (i) {
        jQuery('#' + jQuery(this).attr('id') + ' select[id*="Quantity_"]').each(function (j) {
            var name = jQuery(this).attr('name');
            var Rule = name;
            validation.rules[Rule] = { validate_stages: [i + 1] };
        });
    });
    
    jQuery('div[id*="Stage_"]').each(function (i) {
        var group_ctrls = ''
        jQuery('#' + jQuery(this).attr('id') + ' select[id*="Quantity_"]').each(function (j) {
            var name = jQuery(this).attr('name');
            group_ctrls = group_ctrls + name + ' ';
        });
        validation.groups['group_' + i] = group_ctrls;
    });
    
    jQuery('form:first').validate(validation);
    

    我已经了解了如何动态创建规则,我现在需要了解如何只显示一次错误消息。
    var GetRules = function () {
        var rules = '';
        jQuery('div[id*="Stage_"]').each(function (i) {
            jQuery('#' + jQuery(this).attr('id') + ' select[id*="Quantity_"]').each(function (j) {
                var name = jQuery(this).attr('name');
                rules = rules + '"' + name + '": { validate_stages: [' + (i + 1) + '] }, ';
            });
        });
    
        if (rules.length > 2) {
            rules = rules.slice(0, -2);
        }
        return rules;
    }
    
    var validation =
    {
        errorContainer: "#ValidationSummary",
        errorLabelContainer: "#ValidationSummary",
        groups: {}, rules: {}, messages: {}
    };
    
    jQuery('div[id*="Stage_"]').each(function (i) {
        jQuery('#' + jQuery(this).attr('id') + ' select[id*="Quantity_"]').each(function (j) {
            var name = jQuery(this).attr('name');
            var Rule = name;
            validation.rules[Rule] = { validate_stages: [i + 1] };
        });
    });
    
    jQuery('div[id*="Stage_"]').each(function (i) {
        var group_ctrls = ''
        jQuery('#' + jQuery(this).attr('id') + ' select[id*="Quantity_"]').each(function (j) {
            var name = jQuery(this).attr('name');
            group_ctrls = group_ctrls + name + ' ';
        });
        validation.groups['group_' + i] = group_ctrls;
    });
    
    jQuery('form:first').validate(validation);