2011-07-08 63 views
6

一般描述
在我的表單中,我有一個需要遠程驗證的字段。在遠程調用中,我發送表單元素的值以及該元素可能依賴的其他表單元素的值(用於驗證服務器)。jQuery驗證遠程 - 驗證數據是否在字段中

遠程驗證在調用時效果很好。問題在於,只有在表單元素中存在值時纔會調用遠程驗證。根據發送給遠程驗證的參數,可能需要此表單元素或可能存在其他驗證問題。

如何強制在此字段上進行遠程驗證,無論它是否有數據?

具體方案
得到了一個角色列表,以及一個業務員代碼文本輸入。
服務器端邏輯:(1)如果選擇銷售員角色,需要salespersoncode; (2)如果未選擇銷售員角色,salespersoncode必須爲空。

請注意,我確實有其他表單元素值發送給服務器,並且還有其他服務器端邏輯,我沒有在這裏簡單介紹,因爲它們不會增加此問題的價值,只會混淆視圖。

<select name="roles" id="roles" multiple="multiple" size="5"></select> 
<input type="text" name="salespersoncode" id="salespersoncode" /> 

$("#add_user_form").validate({ 
    rules: { 
    salespersoncode: { 
     remote: { 
     type: "post", 
     url: "/AdminJson/CheckSalespersonCode", 
     dataType: "json", 
     data: { 
      salespersoncode: function() { return $("#salespersoncode").val(); }, 
      roles: function() { return $("#roles").val(); } 
     } 
     } 
    } 
    } 
} 

我不希望把在「需要」驗證選項,因爲在所有情況下不需要salespersoncode領域。

我再次提出問題:如何強制在salespersoncode字段上進行遠程驗證,以確定它是否包含數據?

在此先感謝

回答

1

看起來你不能有一個具有而不讓需要驗證的遠程驗證一個表單元素。 它最終導致依賴不匹配。

遠程方法的第一行是檢查它是否是可選的 - 如果它是可選的,則返回依賴不匹配。 (可選是遠程反轉)

我想出的解決方案是爲'required'規則使用依賴回調。在'required'規則的函數中,調用同步ajax調用來測試服務器上UI中的值,並返回true/false。

0

嘗試首先明確設定salesPersonCode:

salespersoncode: { 
    salesPersonCode: ($("#salespersoncode").val().length > 0) ? $("#salespersoncode").val() : "", 
    remote: { 
     type: "post", 
     url: "/AdminJson/CheckSalespersonCode", 
     dataType: "json", 
     data: { 
      salespersoncode: salesPersonCode; }, 
      roles: function() { return $("#roles").val(); } 
     } 
    } 
} 
+0

裏面的validate()函數,我沒有看到像你建議我如何創建一個局部變量。我已經更新了我的問題,以獲取更多驗證方法的詳細信息。你介意更新你的答案告訴我在哪裏我可以把本地變種沒有瀏覽器顯示JS錯誤? –

+0

也許試試? –

4

調用validate()方法之前添加這段代碼:

$.validator.methods._required = $.validator.methods.required; 
$.validator.methods.required = function(value, element, param) 
{ 
    if ($(element).is('[remote-validator]') && !$(element).hasClass('required')) 
     return true; 
return $.validator.methods._required.call(this, value, element, param); 
} 
+0

這裏重要的一點是,元素必須具有名稱remote-validator的屬性! (沒有值的屬性很好)。如果您不想添加此屬性,並且僅使用遠程驗證_whenever_指定了遠程規則,請使用此條件typeof this.settings.rules [$(element)。attr('name')]!='undefined'&& typeof this.settings.rules [$(element).attr('name')] .remote!='undefined''而不是'$(element).is '[remote-validator]')' – TheStoryCoder

+0

雖然有一個關鍵點!您需要通過在'rules'設置中的'remote'對象上設置屬性/值'async:false'來實現異步遠程調用。否則,你會有意想不到的行爲,例如。 valid()不會等待來自服務器的響應。 – TheStoryCoder