0

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

由于这些问题的性质以及它们需要验证的方式(需要查看整个问题),我得出的结论是开箱即用的必填字段验证器并不能完全解决问题。

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

在我的验证方法中,我根据验证器中的条件传递了 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; 
}
4

2 回答 2

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

它成功了。这是一个快速演示

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

于 2013-07-08T12:25:39.810 回答
0

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

为了将来参考,通过使用服务器的力量并完全避免这种情况来解决这个问题。

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

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

在我的例子中,上面的代码与来自 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; 
}

...我能够得到这个工作,但更复杂的页面通常会导致一些我还没有深入了解的特殊行为。

于 2013-07-08T11:23:47.617 回答