2012-01-28 34 views
3

我有以下情况下可能需要将数据存储在一个conroller成员变量中以便在操作之间共享它。在asp.net中的操作之间共享变量MVC

我有一个搜索表单和一个按钮 - 单击时,根据搜索表单参数返回的表格将返回一个完整的数据。一个行动 - 一切都很好,很干净。

我现在要求放置一个excel按钮,以便用户可以以excel格式下载表格。我不想再次运行数据库查询,因为数据已经存在,但由于我使用的是服务器端的Excel组件,因此我需要服务器上的数据以便将其推送到Excel中。

我最初的想法是在我的控制器中可以存储数据的额外变量。但我从来没有在asp.net MVC中看到过这样的事情。这是一种可接受的模式吗?我的理解是每个行动都是孤立的。

回答

2

MVC模式鼓励无状态。这意味着如果您希望在操作之间保留数据,则需要从客户端发布(服务器不应维护与特定会话相关的任何状态)。 (所以是的每个行动应该是孤立的,不应该依赖任何以前的行动,即它不应该依赖于以前的请求设置)

读一下斯科特的博客MVC在这里的意思是http://weblogs.asp.net/scottgu/archive/2007/10/14/asp-net-mvc-framework.aspx

如果您在访问数据时遇到性能问题,我的建议是使用服务器端缓存您的数据提取。这应该最好在你的应用程序数据访问或查询层实现,并且不应该被强烈地依赖于特定的会话

+0

感谢您的帖子。我有点直觉地意识到这一点,并且它非常有意义 - 认为网络是无状态的。 – sarsnake 2012-01-28 01:28:10

2

控制器在每次请求后都会丢弃。你每次都会得到一个新的。如果你想存储数据,最简单的就是把它放到会话状态。

1

我会建议使用TempData的,例如它在这里http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications

更新说明:返回文件这里完成Returning a file to View/Download in ASP.NET MVC

这是一个正常的做法,有一个单独的控制器来返回文件。

+0

谢谢。这是否有限制? – sarsnake 2012-01-28 01:28:38

+0

你在说什么限制? – Kath 2012-01-28 02:00:22

+0

我刚刚阅读文章,看起来像TempData在这里不太合适,因为我不会在任何地方重定向。用户可能会也可能不会按下Excel按钮,我无法预测他们什么时候会。 – sarsnake 2012-01-28 02:11:33