在asp.net MVC中的动作之间共享变量

时间:2012-01-28 00:44:14

标签: c# asp.net-mvc software-design

我有以下场景可能需要在控制器成员变量中存储数据,以便在操作之间共享它。

我有一个搜索表单和一个按钮 - 单击时,会根据搜索表单参数返回一个包含数据的表。一个动作 - 一切都很好,干净。

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

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

3 个答案:

答案 0 :(得分:2)

每次请求后,控制器都会被丢弃。你每次都会得到一个新的。如果要存储数据,最简单的方法是将其置于会话状态。

答案 1 :(得分:2)

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

阅读scott Gu的博客,了解MVC在这里的含义http://weblogs.asp.net/scottgu/archive/2007/10/14/asp-net-mvc-framework.aspx

如果您在访问数据时出现性能问题,我的建议是使用数据提取的服务器端缓存。理想情况下,这应该在您的应用程序的数据访问或查询层中实现,并且不应该与特定会话紧密相关

答案 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

通常的做法是使用单独的控制器来返回文件。

相关问题