众所周知,UpdatePanel是通过Trigger来更新的。被设定为Trigger的控件在PostBack之后会被客户端 所截获,并且使用XMLHttpRequest对象发送内容,然后服务器端由ScriptManager配合,改变Page对象的 输出,最后得到部分刷新的效果。但是有时候我们可能需要使用JavaScript来刷新UpdatePanel,这时候 就不太方便了。
当然,我们又一个属于Workaround的方法,那就是使用JavaScript来模拟按钮的点击。我们往往会将 一个按钮设为某个UpdatePanel的Trigger,然后在客户端模拟它的点击(我后面会提到,其实这是一个比 较糟糕的做法,没有必要),使UpdatePanel进行更新。但是这样的做法实在太麻烦了些,也相当的不优 雅。
现在我们就来编写一个组件解决这个问题。这个组件的名字叫做JavaScriptUpdater,似乎取得不怎么 样——我一直不擅长取名。
首先来定一个需求吧
我们的目的,其实就是为了在客户端生成一个JavaScript代理,提供一个方法,调用它之后能够刷新 页面。如果一个UpdatePanel的UpdateMode为Always,那么它一定会更新。如果需要更新UpdateMode为 Conditional的UpdatePanel,就需要通过在页面中编写tag来设定哪些UpdatePanel也会被更新。我们需要 尽可能的把编程工作变得最小。
不如我们先考虑使用方式,我们编写的这个JavaScriptUpdater在页面中可以这样使用:
JavaScriptUpdater使用方式
<helper:JavaScriptUpdater runat="server" ID="Updater" MethodName="Refresh"
ResolveUpdatePanel="OnResolveUpdatePanel" Enabled="True">
<UpdatePanels>
<helper:UpdatePanel UpdatePanelID="UpdatePanel1" />
...
</UpdatePanels>
</helper:JavaScriptUpdater>
JavaScriptUpdater有一个简单属性MethodName,表明了在客户端生成代理方法的名字。再上例中该属 性为Refresh,表明我们会调用UpdatePanels.Refresh()方法进行UpdatePanel更新。UpdatePanels是一个 集合属性,可以指定哪些UpdateMode为Conditional的UpdatePanel一同进行更新。如果某个 UpdatePanelID没有找到的话,就会调用ResolveUpdatePanel事件,让用户来指定一个UpdatePanel。还有 一个Enabled属性,用于控制该JavaScriptUpdater是否生效。
一个页面里能够放置多个JavaScriptUpdater,这样可以生成多个JavaScript代理方法。这样的设定, 应该已经足够用了。
实现JavaScriptUpdater
自然,我们先定义最简单的两个类,UpdatePanelHelper.UpdatePanel类,和 ResolveUpdatePanelEventArgs类。由于实在简单,就直接贴一下代码了: