ASP.NET MVC - 相当于ViewState

时间:2012-02-28 10:51:35

标签: asp.net-mvc asp.net-mvc-3

我有一个在网络服务器场上运行的现有网络表单网站(多个网络服务器,每个请求都是非粘性的)。

其中一项任务是从第三方Web服务中检索大量数据。这是一个昂贵的过程(就响应时间而言)。最佳解决方案是最初获取所有数据并将其粘贴在页面的ViewState中(作为List< Product>。然后我们有一个网格,允许我们浏览此产品列表。对于每个请求下一页我们不必重新访问慢速Web服务,因为我们已经在ViewState中缓存了数据。

那么,我将如何使用MVC实现这一目标?如果我使用的是经典ASP,我会将列表序列化并将其保存在表单中的隐藏字段中。

但是使用MVC时首选的方法是什么?如上所述,我使用非粘性会话,因此无法依赖服务器上的缓存。

如果我要将其保存在隐藏字段中,那么首先压缩数据(zip)以减小页面大小是否合理?再一次,最佳实践"这里吗?

非常感谢任何/所有建议

格里夫

PS - 我知道有相似的帖子(例如ASP.NET MVC and ViewState),但他们并没有完全提供我需要的详细信息。

2 个答案:

答案 0 :(得分:4)

以我的拙见,缓存是解决这个问题的最佳方法;点击网络服务,缓存数据,并将其用于每个后续请求。

可以跨多个Web服务器共享缓存。默认行为是将其保留在InProcess中,但这绝不是固定的,可以配置为将其存储在远程InProc缓存,数据库或任何其他半持久存储方法中。想到 Azure AppFabric缓存。

其次,正如您所提到的那样,将所有数据转储到隐藏字段中,但出于多种原因我不喜欢这个想法

  • 页面膨胀 - 每次更改页面时都会提交此数据
  • 丢失数据 - 您必须为每个导航提交表单,忘记这样做意味着丢失数据

命名为2.

答案 1 :(得分:3)

您的策略应该取决于从第三方服务检索的数据的易变性以及调用它的成本。

  • 易失性且价格昂贵。我将在分布式缓存(如Appfabric Velocity或Memcached)中缓存数据。
  • 非易失性且价格昂贵。在每个服务器节点的内存中缓存它的副本。
  • 便宜即可。每次需要时都可以拨打电话。不要打扰缓存。

如果从服务返回的数据集很大,我不会在每次浏览网格数据时上下传递。仅检索当前页面的数据并在网格中呈现它。 Telerik有一个很好的实现,或者你可以尝试自己动手。