代码之家  ›  专栏  ›  技术社区  ›  Erx_VB.NExT.Coder

同时更新MVC页面的不同部分?

  •  2
  • Erx_VB.NExT.Coder  · 技术社区  · 15 年前

    我想在一个操作(比如单击)发生后更新我的MVC页面的不同区域。

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

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

    我知道一个流行的解决方案是对视图的每个“部分”使用多个异步Javascript Ajax请求对服务器进行锤击,但这确实是不必要且效率低下的,只需一个操作就可以重建和破坏页面(比如)5次,当它只发生一次时,一旦发生,服务器就应该管理所有的部分视图。母鸡在那儿。

    有什么想法吗?我绝望了。

    虽然我是MVC框架的初学者,但我相信必须存在一个优雅的解决方案,因为我对MVC有信心,我们肯定不会因为这样的事情而对服务器进行DDOS攻击?

    3 回复  |  直到 15 年前
        1
  •  0
  •   Mattias Jakobsson    15 年前

    我会说,从Ajax调用发送回HTML是一种糟糕的做法。在我看来,一个更好的选择是发送回JSON并使用该数据创建HTML客户端。要创建HTML,可以使用类似于 jtemplates (如果使用jquery)。

    如果您愿意,可以从一个操作发送JSON数据。但这取决于它是什么样的数据。如果它是非常不同的部分,那么您可能应该拆分它,或者根本不使用Ajax,因为您无论如何都要更新页面的大部分内容。

        2
  •  2
  •   Franci Penov    15 年前

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

    但是,这种方法(以及您通常想要做的事情)有几个限制:

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

    坦率地说,如果要更新页面的多个部分,但要批处理该操作,您最好停止使用Ajax并重新加载整个页面。

        3
  •  0
  •   AUSteve    15 年前

    您可以在另一个视图中包含局部视图,只需使用 HTML.RenderPartial 帮手。