×××××××(300分问题)自定义WEB控件,如何才能真正解决“在非窗体控件中保持客户端更改”问题?×××××××

junglerover 2004-12-26 01:38:55
本人初学.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分,绝不食言。帮顶有分!
...全文
241 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
junglerover 2005-01-12
  • 打赏
  • 举报
回复
顶的都有分。不明我的原意,说的不着边际的,没分!
junglerover 2004-12-30
  • 打赏
  • 举报
回复
倒,这么久了还是没反应。

300分真的没有人要???

再重复一遍,帮我顶的送100分!如果3天后仍然没有满意的答案,我将结贴并把300分都送给帮顶的朋友。
tangyanjun1 2004-12-30
  • 打赏
  • 举报
回复
其实我觉得这个和.net已经没什么关系了,是javascript的一个问题吧。
我觉得onsubmit事件如果不会调用的话,那么在高一级body的onUnload事件应该可以调用吧。
我只是提个建议,不代表正确。
jerry1212 2004-12-30
  • 打赏
  • 举报
回复
帮顶一下
Netmark 2004-12-30
  • 打赏
  • 举报
回复
如果你的数据真的很多,而且正确性等又非常严格
JS我觉得不是最好的解决方法

做开发不能一味的追求纯 html+js代码
从安全性等其他角度去考虑,难免要扯到其他技术了
Netmark 2004-12-30
  • 打赏
  • 举报
回复
回复人: li_new() ( ) 信誉:101
---------------------------------

我同意他的方法
Fire_King 2004-12-30
  • 打赏
  • 举报
回复
再重复一遍,帮我顶的送100分!如果3天后仍然没有满意的答案,我将结贴并把300分都送给帮顶的朋友。

----------------------------------------------------------------------------------
看在分的份上! 哈哈!

帮你顶!!!!
li_new 2004-12-30
  • 打赏
  • 举报
回复
对于你的这种情况我的观点是你自己写一个模仿_doPostBack的函数,然后你的控件调用你的函数!例如:在Render(HtmlTextWriter writer)方法中,你可以写一个_MydoPostBack方法。在这个方法中你可以调用SaveData()方法。不要一味的去寻求换掉原有的_doPostBack!
Jinpanxu 2004-12-28
  • 打赏
  • 举报
回复
mark,学习
junglerover 2004-12-28
  • 打赏
  • 举报
回复
300分还是没有人要?
帮我顶的也送100分!
jyu_730 2004-12-28
  • 打赏
  • 举报
回复
那顶下吧。。。。
老大刘 2004-12-28
  • 打赏
  • 举报
回复
我也很想知道如何在不继承Page类,重新实现一个自定义Page类的前提下解决你的问题。我觉得关键好象在于:Page类产生__doPostBack(eventTarget, eventArgument)方法代码的“时间”,以及如果用IsStartupScriptRegistered()方法检测到同名的方法是否可以替换、如何替换。希望有达人指点!
nga96 2004-12-28
  • 打赏
  • 举报
回复
UPUPUP
cs920 2004-12-28
  • 打赏
  • 举报
回复
帮顶~
asxulong 2004-12-28
  • 打赏
  • 举报
回复
收分
老大刘 2004-12-28
  • 打赏
  • 举报
回复
IceSheet() 兄:
我可以负责任地说,你的方法有严重的漏洞。以下内容摘自MSDN

Remarks
The submit method does not invoke the onsubmit event handler.
-----------------------------------------------------------------------------------------
多谢!以前老说别人不求甚解,没想到自己也犯了这个毛病。看来不管从什么人那得到的知识,都有可能有误差,最好还是要仔细看原始技术文档。
junglerover 2004-12-27
  • 打赏
  • 举报
回复
To IceSheet() :
不好意思,我刚才也在回帖,所以没看见你新发的回复。

还是有点偏差。

“你是想把form的onsubmit事件和你的Web控件的某个方法绑定。非常抱歉,没什么更好的方法。”如果是这样,那就好了,因为这是完全可以实现,而且很容易实现的。请参阅HTML元素的attachEvent方法。

我是想与Form的submit方法绑定,而不是与OnSubmit事件绑定。就是因为OnSubmit不被触发,所以我的这个办法无法实现,所以只好退而求其次,只要把其他.Net控件所引发的回发给它截掉就好。
junglerover 2004-12-27
  • 打赏
  • 举报
回复
IceSheet() 兄:
我可以负责任地说,你的方法有严重的漏洞。以下内容摘自MSDN

Remarks
The submit method does not invoke the onsubmit event handler.

实际上,只有在FORM上的Submit按钮被点击的时候,才会触发OnSubmit事件,调用Form1.submit()不会触发OnSubmit事件。

我既不用xmlHttp,更不会去用ACTIVEX 的控件。我做的是一个纯粹的基于.net的服务器端组件,就像大家看到的Calendar, Datagrid等等一样啊。我的问题很简单啊,说白了就是:

已知:所有的.Net的服务器端组件的数据回发都是调用页框架自动生成的__doPostBack (打开一个ASPX页面看看就知道!)
问题:怎样才能改写掉这个 __doPostBack ???
老大刘 2004-12-27
  • 打赏
  • 举报
回复
引用 junglerover(灌木丛)
1.我既然要做一个控件,目的自然是放在Web窗体上让别人用。试想,我怎么能要求别人的开发时,在编写自己的程序之外,还要在每次POSTBACK之前调用一个我的函数?这些功能必须封装在我的控件里,而不是再让人家做额外的工作啊。
---------------------------------------------------------------------------------------
前面的回复没有理解你的本意,如果没理解错的话,你是想把form的onsubmit事件和你的Web控件的某个方法绑定。非常抱歉,没什么更好的方法。
我遇到过类似的情况,也是一个webcontrol,客户端数据用htc组件代码进行过处理,在提交时需要将处理过的内容先保存在隐藏字段。当时的处理方式是把数据保存方法暴露出来,由调用代码在提交时主动执行。
老大刘 2004-12-27
  • 打赏
  • 举报
回复
对你的问题理解得不是很清楚。
就客户端窗体提交而言,除非你自己屏蔽事件代码,客户端的onsubmit事件是一定会触发的。
我一直用如下的方式,实现在窗体提交前进行必要的处理,没发现异常情况:
<form id="Form1" onsubmit="return SaveData();" method="post" runat="server">
...
</form>
在客户端脚本方法SaveData()中保存数据到隐藏字段并提示客户。

如果你想实现客户端数据的保存与窗体的提交无关联。那么你可以采取xmlHttp的方式,服务器端实现一个独立的数据处理页面,客户端采用xmlHttp与服务器端交互。

如果你把编辑控件实现为ActiveX控件,除了采用自己实现xmlHttp交互方式外,你还可以采用WebService方式,直接使用封状好的处理模式(针对不同程序语言的soap协议实现代码模块在网上基本上都可以找到)。
加载更多回复(7)

110,502

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧