在项目开发的时候,会开发一些自定义字段,这些字段在编辑的时候可能包含一些复合控件,例如有文本框,隐藏域等。如果一个列表中只创建一个该类型字段实例时还不会有什么大的问题。但是如果创建了两个以上该字段实例的时候,如果复合控件的ID处理不当,里面又加上了js操作控件处理逻辑,将会出现问题。
例如我在项目中,开发了单一选择用户的自定义字段,见下图所示,
字段中包含了js处理文本框和隐藏域,再有两个以上的该字段实例的时候,给第二个字段选择人员时点击确定,将会填充到第一个字段中,也就是说第二个字段以后将不好使。用developer tool工具查看前两个文本框的ID,竟然是一样的,见下图所示
其原因是自定义字段中对复合控件的ID没有任何处理,这些控件是在RenderingTemplate中声明的,如下图
这里声明文本框ID和隐藏域ID是不可能改成不一样的,那么我们可以从继承自
BaseFieldControl的类中,将以上控件的字段ID改掉,加入一个不同的前缀,最理想的前缀就是用与之关联的Field的InternalName了,如下图
然后再hook的js中修改一下
重新部署之后,就会解决找不到相应文本框的问题了,如下图
希望这种解决方案可以给大家带来帮助。
![](/images/cnblogs_com/happyhzs2000/qsygsl.jpg)