簡體   English   中英

ASP .Net MVC 3:自定義不顯眼的驗證

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM