jquery - 在验证期间选择验证消息

时间:2013-07-08 09:14:08

标签: jquery validation customvalidator

我正在构建一个向页面呈现一系列问题的页面,其中一些问题有多个选项,其他可能只需要用户填写文本框中的某些内容。

由于这些问题的性质以及需要进行验证的方式(需要查看整个问题),我得出的结论是开箱即用的字段验证器不会完全削减它。 / p>

所以我开始写自己的并且遇到了一些障碍......

在我的验证方法中,我传递了2个可能基于验证器中的条件发生的“错误消息”。

如何在这种情况下将它们放在正确的位置? 基于我不知道实际的错误消息应该是什么,直到我到达验证处理程序函数中的失败条件,我需要能够对jquery说“将此设置为错误消息并使该字段失败”。

$.validator.unobtrusive.adapters.add("myrule", ['enable', 'err1', 'err2'], function (options) {
    var value = {
        enable: options.params.enable,
        err1: options.params.err1,
        err2: options.params.err2
    };
    options.rules["myrule"] = value;
    if (options.message) {
        options.messages["myrule"] = options.message;
    }
});

$.validator.addMethod("myrule", function (value, element, params) {
    var question = $(element).closest('fieldset[data-questionId]');
    var result = validateMyrule(question, params['enable'], params['err1'], params['err2']);
    return result;
});

function validateMyrule(question, enabled, err1, err2) 
{
     // actual code omitted to simplify question

     if(someCondition)
     {
         if(someCondition)
         {
             errorMessage = err1;
         }
         else
         {
             errorMessage = err2;
         }

         return false;
     }

     return true; 
}

2 个答案:

答案 0 :(得分:1)

虽然我没有找到使用验证器输出格式化消息的直接方法(例如从验证器返回自定义值并将其作为消息格式化程序中的参数接收),但我能够使用元素数据存储在为了获得所需的效果。

我创建了一个验证器:

var ruleValidator = function(val, el){
    var valid = true, error;
    if(val == "a") {
        valid = false;
        error = 0;
    } else if (val == "b") {
        //...
    }
    if(!valid) {
        //store data within element
        $(el).data("errorId", error);
    }
    return valid;
};

将错误索引存储在元素中,以及错误解析器:

var parseError = function(val, el){
    var errors = ["err a", "err b"];
    var i = $(el).data("errorId");
    return errors[i];
};

返回自定义错误消息。

然后我注册了他们:

$.validator.addMethod("customRule", ruleValidator, parseError);

它成功了。这是一个快速demo

这可能违背了预期的设计,但如果您知道自己在做什么并且有充分理由这样做,那么它似乎是可能的。

答案 1 :(得分:0)

似乎这不能通过设计来完成,这在绑定过程中为时已晚。

以后的参考通过使用服务器的功能并完全避免这种情况来解决这个问题。

根据您的规则,您有2个选项:

  1. 将您的函数拆分为2个不同的函数,这些函数评估并导致仅返回1条消息的正常方式。
  2. (我如何解决我的问题)确定服务器上的“特定于上下文的消息”,并在定义规则的适配器代码中发送该消息。
  3. 上面的代码与我的案例中jquery网站的开箱即用示例非常相似。

    有趣的发现确实可以在某些情况下完成工作......

    使用问题中的代码并修改规则看起来像这样...

    function validateMyrule(question, enabled, err1, err2) 
    {
         // actual code omitted to simplify question
    
         if(someCondition)
         {
             if(someCondition)
             {
                 $.validator.messages.myRule = err1;
             }
             else
             {
                 $.validator.messages.myRule = err2;
             }
    
             return false;
         }
    
         return true; 
    }
    

    ...我能够使这个工作,但更复杂的页面经常导致一些我尚未到底的特殊行为。