2011-09-01 55 views
8

我建立一个MVC应用程序传递数据。我的任务之一是建立一个商店。我设置了一个像向导一样的“向导”,可以让用户填充不同类型的数据,直到操作结束,共7步。ASP.NET MVC - 跨浏览

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

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

现在我修改过的所有设置,我需要内部TempData任何数据,并在每一步刷新所有数据和它似乎正常工作。

我有点糊涂了!

我的困惑是关于所有这些结构:Session(我知道它来自asp.net),ViewData,TempData和魔术ViewBag

我读了很多有关,但我需要有人明确地告诉我什么是更适合我在这种情况下。

+1

Steven Sanderson在他的书Pro ASP.NET MVC 2,第13章>向导和多步骤表单中有关于该主题的详细讨论。如果你有这本书,你可以看看 – archil

+0

我买了这本书,我在等亚马逊先生!与此同时,我的老板问我为什么我们的网站不工作!这是一个艰苦的生活! – JasonMenny

+0

实际上,TempData的默认备份存储是Session。所以我不希望它在会话经常被清除时工作。请注意,尽管 – archil

回答

3

我想说的ViewBag非常适合这样的事情。现在,您将ViewBag称为“Magic”视图包,但实际上它只是包装ViewData,它是一个字典<string,object>

ViewBag的工作方式是它只是ViewData的动态包装,所以,当你问的东西,比方说ViewBag.ShoppingCart,它基本上问的基本字典,如果有所谓的“购物车”的条目,并返回该项目。

UPDATE问题是我不记得ViewBag和ViewData是特定于视图的,所以只要你点击不同的视图/动作,它们就会被清空。

除非你需要的购物车(或向导进度)存储在数据库中,我会去 ViewBag 的TempData你的情况:)

你也可以看看这篇文章从雷切尔苹果在三个多一点信息:

http://rachelappel.com/when-to-use-viewbag-viewdata-or-tempdata-in-asp.net-mvc-3-applications

(附言:我建议你阅读的评论以及对后得到一些更公正的意见。)

+1

在这种情况下如何使用ViewBag?正如我理解这个问题,他需要客户端,多步骤向导。并且他想要保存每步数据以进行下一步 – archil

+0

Infact如果我理解ViewBag(和ViewData)不是我需要的。我需要一个结构,可以在我移动视图的同时放置一些值。现在我在每个视图中使用TempData和HiddenField,它不是很优雅,但它现在正在工作。 – JasonMenny

+0

JasonMenny:对不起,我犯了一个错误,因为ViewBag(ViewData)是针对特定行为的。然而TempData不是,那么为什么不使用它呢? @archil他指定了“视图之间”,所以我没有将它作为客户端读取,而是实际调用不同的ActionMethods。 我会更新我的答案。 –

0

您有几种选择在这里: 使用会议,可视数据(或viewbag),但需要使用隐藏字段或cookies来传递。

可视数据有,这将使更多的工作问题。

我与会话去,但也许它就会在你的情况下清除,因为你可能有一个以上的服务器,并在第二个请求获得了到另一台服务器,它只是将不会有来自前一步骤中的数据。

使用保持着对所有服务器或使用cookie(如果该信息并不重要)的会话的服务器解决这个问题。

2

没有错,使用隐藏域 - 在我的书,至少。

我会'修复'会议问题,而不是试图围绕问题编写代码。运行一个简单的测试:将您的Session提供程序更改为SQL,禁用隐藏的字段并查看您的应用程序是否正常工作。如果没有,还有其他(更大的)问题需要担心。

这个应用程序应该在网上农场/“云”/负载平衡器后面工作吗?如果是这样,您必须:

  • 将会话提供程序更改为其他内容: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也会不时再循环这些工作进程。当它发生时,您最终可能会在同一台计算机上同时运行两个实例(少量时间),并且您的某些用户可能不幸在这些时刻碰到服务器。

下一个请求是否碰到应用程序的另一个实例并不重要。总是试着设计这个目标。

希望它有帮助!