MVC3不显眼的验证:如何从一组元素中删除/重新附加验证?

时间:2011-10-06 11:30:40

标签: javascript jquery asp.net-mvc-3 validation

以下是用例:

我有这个长字段,只有当用户在其中一个可见输入中进行某个选择时才会显示该字段。阅读Brad Wilson关于这个主题的帖子我认为jQuery.validator.unobtrusive.parse('。extra-data')其中.extra-data是一个隐藏div的类。没有运气,因为第一次解析完成后数据已经存在。

所以最后我想出了这个删除规则:

$('.data-panel').find('input[type="text"], textarea, select').each(function (i, item) {
    var currentRules = $(item).rules('remove'); // Saving removed rules to a sorta dictionary
    if (!$.isEmptyObject(currentRules)) {
        removedRules[$(item).attr("name")] = currentRules;
    }
 });

并重新附加它们:

$('.data-panel').find('input[type="text"], textarea, select').each(function (i, item) {
    if (!$.isEmptyObject(removedRules[$(item).attr('name')])) {
        $(item).rules('add', removedRules[$(item).attr('name')]);
    }
});

问题是,感觉有点hacky,因为我真的经历了每个字段删除并重新附加这些验证规则。我的问题是:是不是有更简单的方法?性能也是一个问题,在其中一种巨大的形式中,您可以感受到点击和验证运行之间的延迟。

1 个答案:

答案 0 :(得分:23)

请勿删除并重新附加规则。只需disableenable输入。禁用字段不参与验证,也不会提交给服务器。

//disable inputs. No validation will occur on these
$('.data-panel').find('input[type="text"], textarea, select').attr('disabled', 'disabled');

//enable inputs. Validation is re-enabled
$('.data-panel').find('input[type="text"], textarea, select').removeAttr('disabled');