[英]ASP .Net MVC 3: Custom unobtrusive validation
我正在嘗試向我的應用程序添加自定義的不顯眼的驗證。 它似乎沒有運行驗證。
這是我的屬性類:
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule
{
ErrorMessage = ErrorMessage,
ValidationType = "custrequired"
};
}
還有我的 JavaScript:
$.validator.addMethod('custrequired', function(value, element, param) {
return value && value !== '99:99' && value !== '9:99';
});
$.validator.unobtrusive.adapters.add('custrequired', null, function(options) {
return options.messages['custrequired'] = options.message;
});
這里有很多事情可能會出錯,不涉及您發布的代碼:
您為<input>
生成的 HTML 看起來如何? 它是否包括data-val-custrequired
屬性?
如果沒有,您是否記得在類聲明中添加接口 - IClientValidatable
?
您是否記得不要在DOM ready
處理程序中添加您的自定義驗證器? (即不要使用$(document).ready()
或$(function() { ... })
) - 應該在文檔准備好之前設置驗證。
ETA :最后一個的原因是jquery.validate.unobtrusive
這樣做:
$(function () {
$jQval.unobtrusive.parse(document);
});
即,它在文檔就緒時解析文檔的驗證屬性、規則等。 由於必須加載該腳本才能注冊您的適配器,因此您的注冊腳本通常必須在jquery.validate.unobtrusive.js
之后。 但這也使得您注冊的任何.ready
處理程序在“不顯眼”的處理程序之后被調用 - 到那時為時已晚。 我想你可以把你的注冊腳本放在之前然后使用.ready
。 從未嘗試過,也從未見過這樣做過。
此外,在這種情況下,這應該足以注冊適配器:
$.validator.addMethod('custrequired', function(value, element, param) {
return value && value !== '99:99' && value !== '9:99';
});
jQuery.validator.unobtrusive.adapters.addBool('custrequired');
它仍然會添加您可能擁有的任何自定義錯誤消息,但由於您的驗證器沒有使用其他參數(例如StringLength
傳遞MaximumLength
等),因此不需要自定義適配器。
$.validator.unobtrusive.adapters.add
調用存在一些問題:
$.validator.unobtrusive.adapters.add('custrequired', function (options) {
// -------------------------------------------------^ <-- removed "null" param
options.messages['custrequired'] = options.message;
// Register the rule properly
options.rules['custrequired'] = options.params;
// Don't return anything
});
在這兩個更改之后(並確保在 web.config 中啟用了 ClientValidation 和 UnobtrusiveJavascript),一切正常。
您必須更改服務器端。
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
ModelMetadata metadata, ControllerContext context)
{
//I changed ErrorMessage for ErrorMessageString
yield return new ModelClientValidationRule
{
ErrorMessage = ErrorMessageString,
ValidationType = "custrequired"
};
}
而且正如安德烈·惠特克所說,您必須將其添加到客戶方的驗證中。
//i changed param for params
$.validator.addMethod('custrequired', function(value, element, params) {
return value && value !== '99:99' && value !== '9:99';
});
//i specified that there isn't paramaters using an empty array.
$.validator.unobtrusive.adapters.add('custrequired', [] , function (options) {
options.messages['custrequired'] = options.message;
options.rules['custrequired'] = options.params;
});
記得檢查輸入的 HTML,它應該有“數據-”屬性和你的錯誤消息文本
我希望這個對你有用。
經過一番研究,我找到了一個很好的解決方案,用於在 Asp.Net Mvc 中進行自定義不顯眼和服務器端驗證。 檢查以下鏈接
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.