Tip:自定义UpdatePanelTrigger
2007-03-19 10:27 Jeffrey Zhao 阅读(5149) 评论(8) 编辑 收藏 举报大家在使用UpdatePanel的时候有没有遇到过这种情况呢?
页面上放置着3到4的UpdatePanel,它们互相独立,并且UpdateMode都是Condition,这意味着没有哪个UpdatePanel每次都会更新。大多数UpdatePanel都是由某个控件回发而更新,但是其中的一个例外。它没有哪个控件来触发它,它有自己的一套逻辑来判断是否更新。这段逻辑独立于其他控件。
理论上,这段逻辑可以放在页面的某个生命周期里进行判断,例如OnLoad。但是如果,这个判断甚至必须放在PreRenderComplete之后呢?再者,如果我们真的很想把判断是否更新的逻辑给独立与页面的生命周期的阶段呢?
那么我们可以自己定义一个UpdatePanel触发器。
UpdatePanel触发器的作用自然是用于触发某个UpdatePanel的更新。在ASP.NET AJAX中,我们最常见的UpdatePanel触发器就是AsyncPostBackTrigger和PostBackTrigger。但是在某些需要的时候,我们可以定义自己的触发器。
如果要定义一个UpdatePanel触发器,我们必须继承UpdatePanelTrigger抽象类,并实现它的HasTriggered方法。UpdatePanelTrigger还有一个virtual方法就是Initialize。这个方法会在UpdatePanel的OnInit或OnLoad阶段时调用,它的实现如果要涉及到生命周期方面的问题,则必须注意这一点。HasTriggered方法会在页面Render时——其实是在ASP.NET AJAX自定义的输出方法中被调用。我们可以在这里实现自己的逻辑。
我们现在就来实现一个ProgramicTrigger,用于解决掀先前提出的问题。这个ProgramicTrigge的实现很简单,只有寥寥数行代码:
public class ProgramicTrigger : UpdatePanelTrigger { private string _CheckMethod = null; public string CheckMethod { get { return _CheckMethod; } set { _CheckMethod = value; } } protected override bool HasTriggered() { if (this._CheckMethod != null) { Page page = this.Owner.Page; MethodInfo methodInfo = page.GetType().GetMethod(this._CheckMethod); return (bool)methodInfo.Invoke(page, null); } return false; } }
在HasTriggered方法中,如果用户指定了CheckMethod属性,则使用反射调用定义在页面中的相应方法,得到是否刷新的结果。其实在一开始,我并不想使用反射,而是想定义一个事件,在事件中进行判断。可惜如果使用了事件,在编辑模式下就无法使用XML来指定响应事件的方法了——对于非控件的对象,VS的编辑模式只能指定属性。
ProgramicTrigger使用起来自然也非常方便:
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false"> <ContentTemplate> <%= DateTime.Now %> <asp:Button ID="Button1" runat="server" Text="Button" /> </ContentTemplate> <Triggers> <ext:ProgramicTrigger CheckMethod="CheckMethod" /> </Triggers> </asp:UpdatePanel>
public bool CheckMethod() { // ... }
您可以尝试在CheckMethod中给出不同的实现,然后点击页面中的按钮,察看页面上显示的时间是否变化。
ProgramicTrigger只是最简单的示例,如果需要的话,您不妨在开发过程中也自定义一个UpdatePanel触发器?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)