2012-02-12 76 views
13

我想添加一個自定義的不顯眼的驗證到我的應用程序。它似乎沒有運行驗證。ASP .Net MVC 3:自定義不顯眼的驗證

這裏是我的屬性等級:

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; 
}); 

回答

31

有很多事情可以去錯在這裏,沒有涉及您已經發布代碼:

  • 請問你生成的HTML的<input>看?它是否包含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等),不需要自定義適配器。

+0

我在$(function(){...})中添加了驗證器......我可以知道爲什麼這不起作用嗎? – Moon 2012-02-12 17:21:05

+0

@Moon - 編輯並試圖解釋。 – JimmiTh 2012-02-12 17:58:48

+2

在我的情況下,它不工作,因爲我有'$(document.ready()'裏面的代碼。真棒回答!幫助了很多... – 2012-06-29 18:36:46

3

有幾個問題與$.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) s工作正常。

+0

非常感謝回覆。但仍然無法實現它的工作。 – Moon 2012-02-12 06:33:19

+0

@Moon你有沒有在網頁上的任何錯誤? – 2012-02-12 12:44:04

0

您必須更改服務器端。

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,它應該有「數據 - 」屬性以您的錯誤消息文本

我希望它爲你工作。

相關問題