2011-09-01 58 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也會不時再循環這些工作進程。當它發生時,您最終可能會在同一臺計算機上同時運行兩個實例(少量時間),並且您的某些用戶可能不幸在這些時刻碰到服務器。

下一個請求是否碰到應用程序的另一個實例並不重要。總是試着設計這個目標。

希望它有幫助!