我正在构建一个MVC应用程序。我的任务之一是建立一个商店。我设置了一个像向导一样的“向导”,它使用户可以在操作结束前填写不同类型的数据,共7个步骤。
我的问题是如何在所有这些视图之间共享一些数据。
首先我使用过时的Session
,一切都在我的桌面上工作,但当我最终将我的应用程序部署到我公司的托管服务器时,我得到了例外,因为Session
在某些步骤中被随机删除。 / p>
现在我修改了所有内容以在TempData
中设置我需要的任何数据,并刷新每个步骤中的所有数据,它似乎正常工作。
我有点困惑!
我的困惑在于所有这些结构:会话(我知道它来自asp.net),ViewData
,TempData
和魔术ViewBag
。
我读了很多,但我需要有人清楚地告诉我在这种情况下哪些更适合我。
答案 0 :(得分:3)
我认为ViewBag非常适合这样的事情。现在,您将ViewBag称为“魔术”视图包,但实际上它只包含ViewData,它是<string,object>
的字典
ViewBag的工作方式是它只是一个围绕ViewData的动态包装器,所以当你要求某些东西时,让我们说ViewBag.ShoppingCart,它基本上会询问底层字典是否有一个名为“ShoppingCart”的条目,并返回该项目。
UPDATE 问题是我不记得ViewBag和ViewData是特定于视图的,因此每当您点击其他视图/操作时它们都会被清空。
除非您需要将ShoppingCart(或向导进度)存储在数据库中,否则我会在您的情况下使用 ViewBag TempData:)
你还可以看看Rachel Apple的这篇文章,了解更多有关这三篇文章的信息:
http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications
(Ps。我建议在该帖子上阅读评论以获得一些更公正的意见)
答案 1 :(得分:2)
使用隐藏字段没有错 - 至少在我的书中。
我'修复'会话问题而不是尝试围绕问题编写代码。运行一个简单的测试:将Session提供程序更改为SQL,禁用隐藏字段并查看您的应用程序是否正常运行。如果没有,还有其他(更大)问题需要担心。
这个应用程序应该在负载平衡器的Web场/“云”/后面工作吗?如果是这样,您必须:
http://msdn.microsoft.com/en-us/library/ms178587.aspx和http://memcachedproviders.codeplex.com/
OR
优化:根据需要使用尽可能多的隐藏字段来减少数据库查询的数量(就像我说的那样,没有任何问题),但通常一个字段足以在请求之间保持序列化状态:http://blog.maartenballiauw.be/post/2009/10/08/Leveraging-ASPNET-MVC-2-futures-ViewState.aspx。
即使您不必担心应用程序的多个实例(在不同的计算机上),IIS也会不时地回收工作进程。如果是这样,您最终可能会在同一台计算机上同时运行两个实例(少量时间),并且您的一些用户可能不幸在这些时刻准确地访问服务器。
下一个请求是否会触及应用程序的其他实例并不重要。总是试着设计这个目标。
希望它有所帮助!
答案 2 :(得分:0)
这里有几个选项: 使用session,viewdata(或viewbag),但需要使用隐藏字段或cookie传递它。
Viewdata的问题会带来更多的工作。
我会选择会话,但是在你的情况下它可能会被清除,因为你可能有多个服务器,当第二个请求到达另一个服务器时,它就不会有上一步的数据。 / p>
使用保存所有服务器会话或使用cookie的服务器解决此问题(如果信息不重要)。