一次更新MVC页面的不同部分?

时间:2010-01-16 04:36:28

标签: c# asp.net asp.net-mvc vb.net ajax

我希望在发生一次操作(例如点击)后更新我的MVC页面的不同区域。

如何,我使用ajax,并包装需要更新所有这些部分的整个区域是反直觉的,因为发回的ajax数据将接近整个页面。

所以,我有一些局部视图,但问题是,每个动作只返回一个视图!如何从这一个动作返回多个视图?

我知道一个流行的解决方案就是用视图中每个“部分”的多个异步javascript ajax请求来锤击服务器,但这实际上是不必要的和低效的,重建和销毁页面(比如说)只有一次5次动作,当它应该只发生一次,一旦它发生,服务器应该管理当时和那里的所有部分视图。

任何人的想法?我很绝望。

虽然是mvc框架的初学者,但我确信一个优雅的解决方案必须存在,因为我对MVC人员的信任,我们肯定不会为这样的事情服务器DDoS吗?

3 个答案:

答案 0 :(得分:2)

一种可能的方法是进行批处理操作,脚本将调用该操作。当将结果包装在JSON对象中时,此操作将在内部调用所有部分视图。在客户端,您的脚本将解包部分视图结果,并将它们放在页面中的适当位置。

但是,这种方法存在一些局限性(以及您通常要做的事情):

  • 它会使浏览器缓存无效。由于您不知道哪些部分视图可能已更改,因此批处理操作响应应该是不可缓存的。另一方面,如果您要对每个局部视图进行多次调用,则每个局部视图都可以控制它的缓存,从而可以节省大量带宽。
  • 你人为地减慢了客户的速度。您的网络请求将花费一定的时间来处理在一个线程上在服务器端呈现的所有部分视图(除非您尝试分出多个线程并并行进行调用。)。另一方面,如果您为每个局部视图进行多次调用,则浏览器可以同时创建多个部分视图,这将为您并行执行任务。由于页面的每个部分都会在返回时进行更新,因此整体用户体验可能会更好。
  • 你正在伤害负载平衡。如果要对多个服务器进行负载平衡,则多个请求可能会在不同的服务器上结束,从而创建更好的响应时间。

坦率地说,如果您要更新页面的多个部分,但是想要批量执行该操作,那么您也可以停止使用Ajax,只需重新加载整个页面。

答案 1 :(得分:0)

您可以在另一个视图中包含部分视图,只需使用HTML.RenderPartial帮助程序。

答案 2 :(得分:0)

我会说从ajax调用发回html是不好的做法。在我看来,更好的选择是发送回json并使用该数据来创建html客户端。要创建html,您可以使用像jtemplates这样的javascript模板引擎(如果使用jquery)。

如果您愿意,可以从一个动作发送json数据。但这取决于它是什么类型的数据。如果它是非常不同的部分你可能应该拆分它或者根本不使用ajax,因为你正在更新大部分页面。