1

了Serverside我渲染hiddenfield,我然后使用称为Flexbox的一个jquery插件来创建组合框,它创建一个输入元件的客户端,并复制所选择的ID(未文本)来隐藏字段一旦你在框中选择了一些东西。MVC3不显眼的验证移动验证来定制元素

的问题是验证代码添加了一个类名的hiddenfield什么是错与验证,我希望它被添加到输入要素,我可以以某种方式收听时增加了类名,或somehove勾成该事件并将类名移至输入字段。

这工作,但它作为地狱丑陋,想一个更好的解决方案

var oldClass = $hdn.attr('class'); 

setInterval(function() { 
    if (oldClass != $hdn.attr('class')) { 
     $input.removeClass(oldClass); 
     oldClass = $hdn.attr('class'); 
     $input.addClass($hdn.attr('class')); 
    } 
}, 200); 

感谢。

回答

1

由于Counsellorben我发现了一个很好的解决方案,我做了一个稍微不同的方式,但。 首先,我重写了在document.ready构造的主对象构造函数中的默认方法。的document.ready然而为时已晚,做从form.valid(触发验证时,但它会做一个提交(很奇怪)此代码的工作既为提交和脚本触发时,特里格你的方法不会触发)

(function() { 
    var highlight = $.validator.defaults.highlight; 
    var unhighlight = $.validator.defaults.unhighlight; 

    $.validator.setDefaults({ 
     highlight: function (element, errorClass, validClass) { 
      if ($(element).attr("data-val-visualId") != null) { 
       element = $("#" + $(element).attr("data-val-visualId"))[0]; 
      } 
      highlight(element, errorClass, validClass); 
     }, 
     unhighlight: function (element, errorClass, validClass) { 
      if ($(element).attr("data-val-visualId") != null) { 
       element = $("#" + $(element).attr("data-val-visualId"))[0]; 
      } 
      unhighlight(element, errorClass, validClass); 
     } 
    }); 
})(); 
3

在那里我有正在验证一个隐藏的元素,我添加了一个自定义属性,data-val-visibleid。然后,在jquery.validate.js,我通过在这两个功能的末尾添加以下修改highlightunhighlight功能:

if ($(element).is(":hidden")) { 
    var targetId = $(element).attr("data-val-visibleid"); 
    $("#" + targetId).addClass(errorClass).removeClass(validClass); 
} 

有些人不喜欢jquery.validate.js染指,但它通常是最容易的方法来实现这样的自定义。

UPDATE

我做了一些研究,并发现jquery.validate有一个漂亮的setDefault方法,在这里你可以覆盖默认的功能,如高亮()和unhighlight。在加载其他脚本后,将以下内容添加到您的页面:

$.validator.setDefaults({ 
    highlight: function (element, errorClass, validClass) { 
     $(element).addClass(errorClass).removeClass(validClass); 
     if ($(element).is(":hidden")) { 
      var targetId = $(element).attr("data-val-visibleid"); 
      $("#" + targetId).addClass(errorClass).removeClass(validClass); 
     } 
    }, 
    unhighlight: function (element, errorClass, validClass) { 
     $(element).removeClass(errorClass).addClass(validClass); 
     if ($(element).is(":hidden")) { 
      var targetId = $(element).attr("data-val-visibleid"); 
      $("#" + targetId).addClass(errorClass).removeClass(validClass); 
     } 
    } 
}); 

这将覆盖默认功能,而不更改基础脚本。

+0

在我的最后一个项目,我们不可能更新的jQuery或jQuery UI的,因为有些人都已经对这些文件的太多的变化,所以我支持那些不喜欢在API文件改变..我是希望有一个更清洁的解决方案 – Anders

+0

安德斯,我从来没有感到太高兴了修改核心jquery.validate文件,所以我进一步检查,发现它有一个'setDefault'功能,这样你就可以有一个包含外部脚本您的自定义覆盖。 – counsellorben

+0

酷,这就是我正在寻找! – Anders

相关问题