近期开发项目,用到了列表控件LightPowerGridView的冻结功能,但是在列表控件中如果用到了文本框会出现一个很大的问题:
页面回发后,文本框的值会逗号叠加。如:回发前 10.00,回发后就会变成10.00,10.00。
经过一天多时间,问题终告解决,长吁一口气~~~
接下来,分享下问题解决过程:
1)首先怀疑是superTable冻结功能的问题,底层其实也就是调用了superTable冻结功能。
【superTable是专门进行列表控件的js框架,基本原理就是复制了一份新的列表html以便进行冻结控制】
F12调试,发现在传递给superTable的时候,html已经就是错误的了
结论:superTable冻结功能本身没问题
2)接着怀疑是底层列表控件有问题
那么我就直接在开发的页面中,手动调用superTable冻结功能,发现同样存在问题
结论:底层控件本身没问题
3)现在只能怀疑是微软的列表控件绑定本身就存在问题
验证1:修改superTable的脚本,在复制一份html的基础上,再复制一份出来,这个时候冻结绑定,回发后文本框内容变成了10.00,10.00,10.00!!!
结论:应该就是微软的列表控件GridView在绑定的时候,如果找到多个相同的控件,会导致重复赋值。
解决:
如果id不一样,应该问题就可以解决了吧?
于是在复制html的时候,将不展示出来的那部分html中的文本框id+1,
测试:问题依旧存在,那么可能是name控制的绑定吧
继续修改name+1,如下:
$(this.sFDataTable).find('input[type="text"]').each(function () { $(this).attr('name', $(this).attr('name') + 1); });
测试:文本框内容不再发生叠加,问题解决。
再次测试:页面中添加一个name相同的input text,照样会导致文本框内容叠加。
最终结论:
1、冻结效果是底层调用superTable实现的,当然也可以自己手动调用
2、superTable会复制一份列表控件的html,以便实现冻结效果
3、列表控件在回发绑定的时候,会在html中根据name找对应的控件赋值,如果有多个name相同的控件,就会重复赋值并且,分隔