2014-11-06 24 views
0

我有我的ASP MVC項目和jQuery客戶端驗證的一個問題。 問題是,當按下提交按鈕時,表單被驗證,但錯誤沒有顯示,表單被提交。 只有在驗證方法中調用valid()時纔會出現問題。 例如:我有一個isdatebefore和isdate之後的驗證方法。 我想檢查#start是否在#end之前。 因此,驗證#start時,它也會在#end上進行驗證,以確保錯誤消息在兩個元素上都顯示/消失。 我添加了驗證onfocusout,這工作得很好(在#start和#ejnd字段和表單中的所有其他字段)。 但是,當我按下提交按鈕,表單被驗證(我放置了一些斷點,以查看方法是否被調用),但提交,雖然存在錯誤。ASP MVC jQuery驗證onfocusout在工作,但不能在表單提交

這裏是我的代碼:

// Add IsDateAfter validation 
$.validator.addMethod("isdateafter", function (value, element, params) { 
    var self = $(element); 
    var parts = element.name.split("."); 
    var prefix = ""; 
    for (var i = 0; i < parts.length - 1; i++) 
     prefix = parts[i] + "."; 
    var otherElement = $('input[name="' + prefix + params.propertytested + '"]'); 
    var startdatevalue = otherElement.val(); 
    if (!value || !startdatevalue) 
     return true; 
    var allowequal = params.allowequaldates.toLowerCase() === "true"; 
    var start = Globalize.parseDate(startdatevalue); 
    var end = Globalize.parseDate(value); 
    if (!self.data('reval')) { 
     self.data('reval', true); 
     otherElement.data('reval', true); 
     otherElement.valid(); 
     self.data('reval', false); 
     otherElement.data('reval', false); 
    } 
    var isValid = allowequal ? start <= end : 
     start < end; 
    if (isValid) { 
     self.removeClass('input-validation-error'); 
    } 
    return isValid; 
}); 

$.validator.unobtrusive.adapters.add(
    'isdateafter', ['propertytested', 'allowequaldates'], function (options) { 
     options.rules['isdateafter'] = options.params; 
     options.messages['isdateafter'] = options.message; 
    }); 

// Add IsDateBefore validation 
$.validator.addMethod("isdatebefore", function (value, element, params) { 
    var self = $(element); 
    var parts = element.name.split("."); 
    var prefix = ""; 
    for (var i = 0; i < parts.length - 1; i++) 
     prefix = parts[i] + "."; 
    var otherElement = $('input[name="' + prefix + params.propertytested + '"]'); 
    var startdatevalue = otherElement.val(); 
    if (!value || !startdatevalue) 
     return true; 
    var allowequal = params.allowequaldates.toLowerCase() === "true"; 
    var start = Globalize.parseDate(startdatevalue); 
    var end = Globalize.parseDate(value); 
    if (!self.data('reval')) { 
     self.data('reval', true); 
     otherElement.data('reval', true); 
     otherElement.valid(); 
     self.data('reval', false); 
     otherElement.data('reval', false); 
    } 
    var isValid = allowequal ? start >= end : 
     start > end; 
    if (isValid) { 
     $(element).removeClass('input-validation-error'); 
    } 
    return isValid; 
}); 

$.validator.unobtrusive.adapters.add(
    'isdatebefore', ['propertytested', 'allowequaldates'], function (options) { 
     options.rules['isdatebefore'] = options.params; 
     options.messages['isdatebefore'] = options.message; 
    }); 

代碼工作正常與onfocusout在事件,但有問題文稱爲onsubmit事件裏。 當我刪除調用otherElement.valid();一切工作再次(但我需要驗證其他元素,使其正常工作)。

所以沒有任何人知道我可以保持一個驗證時驗證這兩個元素仍然有它不提交搞砸了?

+0

如何提交表單?使用 – chiapa 2014-11-06 11:16:52

+0

一個簡單的按鈕:<按鈕類型= 「提交」>保存 – wertzui 2014-11-06 11:28:19

+0

您是否嘗試過'<按鈕類型= 「提交」 的onclick = 「返回validateForm()」>保存'?在'validateForm()'函數中,你可以檢查表單的有效性 – chiapa 2014-11-06 11:52:37

回答

1

您不能從另一個jQuery驗證方法中使用的.valid()方法。

Use .element() instead ...

$('#yourForm').validate().element(otherElement); 

或使用關鍵字this,這表示從插件的自己的方法中validator對象...

this.element(otherElement); 

或作爲您已經確認爲工作(有些重複,如果this關鍵字的工作)...

otherElement.parents('form').validate().element(otherElement); 
+0

感謝您指點我正確的方向!但是你必須調用otherElement.parents('form')。validate()。element(otherElement);因爲元素方法是連接到表單的驗證程序的成員。如果你編輯你的答案,我會高興地接受它:) – wertzui 2014-11-06 15:45:57

+0

@wertzui,是的,你當然是對的。我只是測試它,'this'關鍵字也代表方法中的'validator'對象。 – Sparky 2014-11-06 16:05:52

+0

再次具有與它trouple後,我發現,使用'this.element(otherElement);''調用this.prepareElement(元件);'它調用'this.reset();'。因此,如果之前已經驗證過的字段(即在之前的HTML標記中)已被標記爲無效,那麼這將打破提交驗證,因爲this.reset();將清除this.errorList。因此,不要使用'this.element(otherElement);'你必須使用'this.check(otherElement);' – wertzui 2015-04-14 08:09:43

相關問題