×××××××(300分问题)自定义WEB控件,如何才能真正解决“在非窗体控件中保持客户端更改”问题?×××××××
本人初学.Net,正在做一个“表格编辑”的自定义Web控件。现在客户端功能都已实现,也参考了MSDN中的“在非窗体控件中保持客户端更改”章节,只要在Web页上的Form提交之前,执行一个我自己的Javascript函数SaveData,就能将客户端对表格的编辑写入隐藏域,然后上传回服务器端。
现在的问题是:如何能保证,该WEB页每次被上传时,都能调用我的SaveData函数?我不可能在表格内容每次被编辑的时候都调用SaveData函数,因为表格行数可能很多,每次更改时都调用SaveData会极大地降低客户端的运行效率。这里就和MSDN中“在非窗体控件中保持客户端更改”章节所举的例子不同,它的控件很简单,每次客户端做修改时,都直接更新隐藏域的值。
我已经尝试过在控件OnInit时调用Page.RegisterOnSubmitStatement,但是我发现这个方法是没有意义的,它只是简单地把你要调用的Script代码写入Form的OnSubmit事件,而众所周知的是,Form.Submit并不触发OnSubmit事件。
例如,你在页面上放一个Calendar,它点击任何日期时都会提交,但是,不会触发Form的Onsubmit事件,使用Page.RegisterOnSubmitStatement写入的客户端代码也不会被调用。
我现在的做法是:使用Page.RegisterStartupScript,自己写一个__doPostBack ,强行覆盖掉由页框架自动生成的__doPostBack(eventTarget, eventArgument)方法,在这个方法里面执行SaveData 。其实也没有真正覆盖掉,只是在最后生成的页面HTML代码中会有2个同名的JAVASCRIPT方法而已。因为我的方法比原有的__doPostBack后生成,最后的效果好像是__doPostBack被我重载掉了。
这样做虽然暂时可以解决问题,但是我认为它是不完善的。比如,有没有办法,直接改掉由页框架自动生成的__doPostBack代码?
如能解决该问题,将给出300分,绝不食言。帮顶有分!