2011-08-04 159 views
10

我最近有一個問題,關於getting checkbox validation working在MVC項目中的客戶端。這個問題被成功回答了,但又提出了另一個問題。MVC添加方法到jquery.validate.unobtrusive.js

爲了讓我的複選框的驗證工作,我需要的JavaScript以下位直接添加到jquery.validate.unobtrusive.js:

$jQval.addMethod("mustbetrue", function (value, element, param) { 
    // check if dependency is met 
    if (!this.depend(param, element)) 
     return "dependency-mismatch"; 
    return element.checked; 
}); 

adapters.add("mustbetrue", function (options) { 
    setValidationValues(options, "mustbetrue", true); 
}); 

這個偉大的工作,但我不高興不必以防萬一Microsoft或驗證插件男孩將來更新該文件。如果我還沒有在項目中工作,這個文件可能會被覆蓋,而沒有人意識到它已被定製。

所以考慮到這一點我嘗試添加到一個外部JavaScript文件是:

$.validator.addMethod("mustbetrue", function (value, element, param) { 
    // check if dependency is met 
    if (!this.depend(param, element)) 
     return "dependency-mismatch"; 
    return element.checked; 
}); 

$.validator.unobtrusive.adapters.add("mustbetrue", function (options) { 
    setValidationValues(options, "mustbetrue", true); 
}); 

不幸的是,現在我的複選框的客戶端腳本不運行。任何人都可以看到我做錯了什麼?

在此先感謝

小號

回答

9

嗅探器,

我越是看這個,我越搖我的頭(我自己)。

經進一步審查,Darin的方法將工作,只要你添加一行到他的網頁腳本:

<script type="text/javascript"> 
    $.validator.unobtrusive.adapters.addBool("mustbetrue", "required"); 
    $.validator.unobtrusive.parse(); 
</script> 

每當你做出改變(如添加新的適配器),則必須重新解析不顯眼的驗證屬性。由於jquery.validate.unobtrusive.js中的最後一個操作是解析屬性,並且在解析後添加適配器,所以重新解析可解決此問題。

counsellorben

P.S.這解決了您的問題,但仍然無法解決如何添加其他不使用內置方法的其他自定義驗證程序的問題,而無需修改jquery.validate.unobtrusive.js

P.P.S.我找到了添加自定義驗證方法的答案。爲了在不修改jquery.validate.unobtrusive.js的情況下添加自定義驗證方法,您需要「借用」它的一些代碼以添加到您的頁面腳本中。添加自定義方法,然後如下所示:

<script type="text/javascript"> 
    var $jQval = $.validator, 
     adapters, 
     data_validation = "unobtrusiveValidation"; 

    function setValidationValues(options, ruleName, value) { 
     options.rules[ruleName] = value; 
     if (options.message) { 
      options.messages[ruleName] = options.message; 
     } 
    } 

    $jQval.addMethod("mustbetrue", function (value, element, param) { 
     // check if dependency is met 
     if (!this.depend(param, element)) 
      return "dependency-mismatch"; 
     return element.checked; 
    }); 

    $.validator.unobtrusive.adapters.add("mustbetrue", function (options) { 
     setValidationValues(options, "mustbetrue", true); 
    }); 

    $jQval.unobtrusive.parse(); 
</script> 
+0

再次感謝!儘管我很清楚你在說什麼,但它理解它應該可以工作,只要我從jquery.validate.unobtrusive.js中添加'addMethod'和'add'並將上面的任何組合放到另一箇中js文件停止工作!我甚至將consol.log放在jquery.validate.unobtrusive.js文件的ath addBool方法中,以檢查「mustbetrue」是否正在註冊,並且是!正如我所說奇怪! – Sniffer

+0

我認爲這是非常重要的說,你需要在您的標記爲上述解決方案的工作:

+0

您可以簡化添加您的不顯眼的適配器:$ .validator .unobtrusive.adapters.addBool( 「mustbetrue」);只要您在文檔之外添加新的驗證方法和適配器,您也不需要調用分析。 –

0

我沒有問題,將此代碼添加到一個外部JavaScript文件,這是我從This site

// Custom validator for checkboxs 
jQuery.validator.unobtrusive.adapters.add("brequired", function (options) {  
    //bool-required for checkboxes  
    if (options.element.tagName.toUpperCase() == "INPUT" && 
     options.element.type.toUpperCase() == "CHECKBOX") 
    { 
     options.rules["required"] = true;   
     if (options.message) { 
      options.messages["required"] = options.message; 
     } 
    } 
}); 

偷你確定你把你的腳本在頁面中的jQuery腳本之後?礦是列表中的最後一個。

+0

我做了,它不工作。 – Rookian

3

不顯眼的驗證只給我一點悲傷。

在一個非常非常簡單的測試頁面,這個工程:

$(document).ready(function() { 
    jQuery.validator.unobtrusive.adapters.add(
     'mustbetrue', ['properties'], function (options) { 
      options.rules['mustbetrue'] = options.params; 
      options.messages['mustbetrue'] = options.message; 
     } 
     ); 

    jQuery.validator.addMethod('mustbetrue', function (value, element, params) { 
     // check if dependency is met 
     if (!this.depend(param, element)) { 
      return "dependency-mismatch"; 
     } 

     switch (element.type) { 
      case "checkbox": 
       return element.checked; 
       break; 
      case "hidden": 
       return (value == 'true' || value == 'True'); 
       break; 
      default: 
       alert('type = ' + element.type); 
       return true; 
       break; 
     } 
    }); 
}); 

然而,當我這個代碼移到我的更復雜的形式,它突然停止工作,我不知道爲什麼,沒有時間去鑽研進入不顯眼的代碼來嘗試發現。

counsellorben的解決方案以我的更復雜的形式工作。

如果任何人都可以指向一個網站,詳細解釋如何正確地添加一個自定義驗證器到不顯眼的驗證,我將永遠是偉大的。我訪問的每個站點都有不同的解決方案。

+3

此代碼不應處於文檔準備就緒功能。不顯眼的驗證在準備好的文檔上運行,所有添加的規則預計會在那時添加。 –

+0

@ErikW是的,我一直在爲此掙扎大約一個小時,現在我可以確認**這個代碼不應該在文檔準備好功能** - 它不會工作。 –