我有以下场景可能需要在控制器成员变量中存储数据,以便在操作之间共享它。
我有一个搜索表单和一个按钮 - 单击时,会根据搜索表单参数返回一个包含数据的表。一个动作 - 一切都很好,干净。
我现在被要求放置一个excel按钮,以便用户可以以excel格式下载该表。我不想再次运行db查询,因为数据已经存在,但由于我使用的是服务器端Excel组件,我需要在服务器上提供数据才能将其推送到Excel中。
我最初的想法是在我的控制器中有一个额外的变量,可以存储数据。但我从来没有在asp.net MVC中看到过这种情况。这是一种公认的模式吗?我的理解是每个动作都是孤立的。
答案 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
通常的做法是使用单独的控制器来返回文件。