我正在开发一个项目,其中一个中心类(主题)将包含大量数据。将有一个使用.net ajax显示此数据的aspx页面。当从任何页面更新主题时,我希望更新所有打开的页面。我将使用观察者模式。问题是,我是否将实际的aspx页面作为观察者,还是有更好的方法来做到这一点?
答案 0 :(得分:6)
在这种情况下,观察者模式没有意义。
Web(和ASP.NET)通过请求(例如来自Web浏览器)和响应(例如来自Web服务器)来工作。
观察者模式要求主体(例如Web服务器)维护对其观察者(例如Web浏览器)的引用并向其推送通知更新。显然,这不适用于Web浏览器 - Web服务器方案。
我同意Sergio的观点,最好的方法可能是让您的客户(Web浏览器)定期检查资源(Web服务器)的更新。执行此操作的最佳方法是AJAX调用。
一个很好的例子是Gmail,新邮件在服务器上收到后很快就会出现在收件箱中,用户无需发出明确请求。这是通过AJAX调用完成的,该调用定期检查Gmail服务器是否有新消息。
更新(2012.03.01): -
最近的发展已经允许将数据从网络服务器推送到客户端以成为更现实的可能性,例如, SignalR
答案 1 :(得分:2)
塞尔吉奥是对的,你也是如此。通过Asp.Net AJAX实现此功能的最简单方法是使用AJAX计时器控件,但您当然不希望在所有页面中复制它。更好的方法是将该功能包装到Master页面中,甚至创建一个派生自Page的基页。
查看MSDN page on the Timer Control,以及体面的video tutorial。
作为设计的旁注,我不一定会将实际的观察者代码放在你的代码中。相反,您希望将这些事件转发到某些底层模型。我们的想法是,您的Code Behind仅负责与UI相关的内容以及实现这一目标的逻辑。基本上是MVP / MVP中的 V 。
此外,我不确定“实际”观察者模式在Web上下文中的适用程度,因为您正在讨论没有真实状态的单个HTTP响应/请求周期。
答案 2 :(得分:1)
我不熟悉观察者模式,但是你必须这样做的唯一方法是在页面加载上放置一个javascript无限循环,每隔X秒调用一次服务器上的AJAX方法来检查更新。