2012-07-20 58 views
0

我有一個規則,說每個階段的總數量選擇必須等於預訂乘客的人數。每個階段在DIV定義像在這個例子中: -jQuery驗證插件 - 防止重複錯誤消息

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> 

因此,例如,如果我有上述樣品中的4名乘客預訂量1-3的總和值必須等於4並且還量的總和值4-5也必須等於4。

我然後使用jQuery驗證插件來驗證...

腳本

function ValidateStages(value, element, options) { 
    var stage = options[0]; 

    var valid = true; 
    var arrVS = new Array(0); 

    jQuery('div[id*="Stage_' + stage + '"] select[id*="Quantity"]').each(function() { 
     var e = jQuery(this); 
     if (arrVS[e.attr('data-stage')] == undefined) { 
      arrVS[e.attr('data-stage')] = 0; 
     } 
     arrVS[e.attr('data-stage')] += parseInt(e.val()); 
    }); 

    for (key in arrVS) { 
     if(arrVS[key] != MaxPassengers) { 
      valid = false; 
     } 
    } 

    return valid; 
} 

jQuery(document).ready(function() { 
    jQuery.validator.addMethod("validate_stages", ValidateStages, "Stage {0} error "); 

    jQuery('form:first').validate({ 
     errorContainer: "#ValidationSummary", 
     errorLabelContainer: "#ValidationSummary", 
     rules: { 
      "Items[1].Quantity": { validate_stages: [1] } , 
      "Items[2].Quantity": { validate_stages: [1] } , 
      "Items[3].Quantity": { validate_stages: [1] } , 
      "Items[4].Quantity": { validate_stages: [2] } , 
      "Items[5].Quantity": { validate_stages: [2] } 
     }, 
    }); 
}); 

問題

我有以下問題: - 將顯示在頁面上每個下拉

  1. 錯誤消息。例如,如果說「階段1錯誤階段1錯誤階段1錯誤階段2錯誤階段2錯誤」。如果階段1和階段2無效,則應該只顯示「階段1錯誤階段2錯誤

  2. 正如您所見,規則是硬編碼的。我確實嘗試創建一個函數(見下文),它可以即時創建規則,但我不知道如何應用它。如果我嘗試做規則:{GetRules()}然後我就得到一個錯誤說 「預計:」

    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; 
    } 
    
+0

我已經想出瞭如何動態創建規則,我現在只需要瞭解如何只顯示錯誤消息一次。 – 2012-07-20 14:44:40

+0

想象一下,見下文。 – 2012-07-20 15:10:27

回答

0

想通了自己。我需要將驗證器上的控件分組。一旦完成,我可以在單獨的容器中顯示每個階段的錯誤。這些組和規則是動態創建的,如下所示...

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); 
相關問題