ASP.NET MVC - 跨视图传递数据

时间:2011-09-01 08:33:10

标签: .net asp.net-mvc wizard

我正在构建一个MVC应用程序。我的任务之一是建立一个商店。我设置了一个像向导一样的“向导”,它使用户可以在操作结束前填写不同类型的数据,共7个步骤。

我的问题是如何在所有这些视图之间共享一些数据。

首先我使用过时的Session,一切都在我的桌面上工作,但当我最终将我的应用程序部署到我公司的托管服务器时,我得到了例外,因为Session在某些步骤中被随机删除。 / p>

现在我修改了所有内容以在TempData中设置我需要的任何数据,并刷新每个步骤中的所有数据,它似乎正常工作。

我有点困惑!

我的困惑在于所有这些结构:会话(我知道它来自asp.net),ViewDataTempData和魔术ViewBag

我读了很多,但我需要有人清楚地告诉我在这种情况下哪些更适合我。

3 个答案:

答案 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场/“云”/后面工作吗?如果是这样,您必须:

  • 将会话提供程序更改为其他内容:SQL,StateServer,memcache等。不需要更改代码。

http://msdn.microsoft.com/en-us/library/ms178587.aspxhttp://memcachedproviders.codeplex.com/

OR

  • 重新设计向导步骤,减少对视图之间共享值的依赖。会话ID就是您所需要的,您可以在数据库中查询其他任何内容。不是很快但安全稳定。

优化:根据需要使用尽可能多的隐藏字段来减少数据库查询的数量(就像我说的那样,没有任何问题),但通常一个字段足以在请求之间保持序列化状态: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的服务器解决此问题(如果信息不重要)。