【问题标题】:ASP .Net MVC 3: Custom unobtrusive validationASP .Net MVC 3:自定义不显眼的验证
【发布时间】:2012-03-03 23:45:55
【问题描述】:

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

这是我的属性类:

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

【问题讨论】:

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


    【解决方案1】:

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

    • 您为&lt;input&gt; 生成的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 等),因此不需要自定义适配器。

    【讨论】:

    • 我在$(function() { ... }) 中添加了验证器...我能知道这不起作用的原因吗?
    • @Moon - 编辑并尝试解释。
    • 在我的情况下它不起作用,因为我在 $(document.ready() 中有代码。真棒答案!帮了大忙……
    • +1 救了我。很多解决方案,无论是在 SO 上还是在 Web 上,但都没有提到不要在 DOM 就绪处理程序中添加自定义验证器。
    • 如果你真的想在 $(function(){...}) 中设置你的验证器,你可以在方法的末尾重新解析 $jQval.unobtrusive.parse(document);
    【解决方案2】:

    $.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),一切正常。

    【讨论】:

    • 非常感谢您的回复。但仍然无法让它工作。
    【解决方案3】:

    你必须改变服务器端。

        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,它应该具有带有错误消息文本的“data-”属性

    我希望它对你有用。

    【讨论】:

      【解决方案4】:

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

      Raymund Macaalay

      【讨论】:

        猜你喜欢
        • 2013-10-22
        • 2011-12-06
        • 1970-01-01
        • 2016-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-09
        • 1970-01-01
        相关资源
        最近更新 更多