ASP .Net MVC 3:自定义不显眼的验证

时间:2012-02-12 02:18:46

标签: jquery asp.net-mvc asp.net-mvc-3 jquery-validate

我正在尝试为我的应用添加自定义不显眼的验证。它似乎没有运行验证。

这是我的属性类:

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

4 个答案:

答案 0 :(得分:31)

这里有很多可能出错的地方,没有涉及你发布的代码:

  • 您为<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等),因此无需自定义适配器

答案 1 :(得分: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),一切正常。

答案 2 :(得分: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,它应该有“数据 - ”错误消息的文字

我希望它适合你。

答案 3 :(得分:0)

经过一些研究,我找到了一个很好的解决方案,用于在 Asp.Net Mvc 中进行自定义不显眼和服务器端验证。检查以下链接

Raymund Macaalay