2008-12-22 34 views
94

我使用AcceptVerbs方法在斯科特谷的第五個預覽版的博客文章中詳述與形式條目ASP.NET MVC處理:ASP.NET MVC - TempData的 - 是好是壞的做法

  • 用戶得到一個空通過GET形式
  • 用戶的帖子通過POST填充在形式上相同的動作
  • 行動驗證數據,採取適當的行動,並重定向到一個新的視圖

所以我沒有用TempData。這就是說,我現在必須在這個過程中增加一個「確認」步驟,而且似乎需要使用TempData

出於某種原因,我很反感使用TempData - 這是值得圍繞設計。

這是在所有有效的關注,還是我做起來?

+1

考慮讓你的'確認'步驟的JavaScript對話框。服務器往返次數減少,你不會遇到這個問題。 – ajma 2009-02-19 17:45:44

回答

24

我有種想臨時數據爲用於通知用戶一個發射後不管的機制。最好給他們一些他們最近做的事情的提醒,但是我也會猶豫是否在某些用戶流程中將其作爲必要的步驟。原因是如果他們刷新頁面,我相信它會消失。嗯,我想我也猶豫是否使用它,因爲它沒有很好地定義它的可靠性。

我不知道這個問題是你遇到的動作重定向到另一個頁面的確認步驟之前。我想知道是否他們第一次提交後,你可以做足夠的處理來生成確認對話框,然後返回帶有確認問題的原始頁面。與您可能進行驗證的方式類似,只是驗證規則檢查是否執行了確認步驟(確認UI隱藏,直到其他驗證通過)。

2

這就像使用ViewData,這意味着它可能不是安全風險。但我寧願使用ViewData而不是TempData。點擊此處查看比較:http://www.squaredroot.com/2007/12/20/mvc-viewdata-vs-tempdata/

根據設計的不同,您可以隨時在數據庫的tempdata中存儲用戶/籃子或任何您需要的數據,並且只需要一個「IsReady」字段來指示其是否已完成,如果你想記住的話,以後可以擴展,人們可以關閉他們的瀏覽器。

+0

隨機downvote? – 2011-04-06 04:48:39

+2

注意:您鏈接到的文章是最新的,但僅適用於MVC1。在MVC2中,TempData發生了很大變化。 – mikemanne 2011-10-21 16:46:49

+0

@mikemanne,是的。但答案是從2008年底。但也許答案應該更新? – 2011-10-22 15:53:50

2

爲什麼你有這樣的厭惡?這件事僅僅是讓自己的工作,使其順利:)

如果你不喜歡它,因爲它的非強類型的,你總是可以使包裝在其周圍會爲您提供強類型的接口。

3

我有用於TempData的[「模型」]首先檢查,並返回一個GetModel方法。否則,GetModel從數據庫加載適當的數據。

當我有需要返回需要相同的模型數據的不同視圖的操作它節省了從數據庫中額外的負擔。

+0

Yah,我遇到過這樣的情況:(1)驗證記錄是否存在,如果有效,則重定向到頁面(2)加載記錄以供用戶顯示。所以數據庫被打上驗證和顯示。我幾乎使用TempData來做這件事,但感覺像是檢查意見。我喜歡你的方法來包含它。 – anonymous 2008-12-22 18:02:59

+0

在這種情況下使用適當的緩存機制會更好。 – nicodemus13 2014-03-21 09:35:41

31

我認爲你做的很好用TempData的前猶豫。 TempData的是存儲在會話,這可能影響你,如果:

  1. 你沒有在網站上使用會話現在
  2. 您有需要擴展到高吞吐量的系統,也就是你」 ð希望避免會話狀態完全
  3. 你不想使用cookies(我不知道如何MVC以及支持Cookie會話現在)

如果您的網站需要具有高可用性,則有是應用會話狀態的附加考慮,但這些都是solvabl問題。

76

不需要有反感TempData的...但如果不能正確使用,則可能肯定是設計較差的指示。如果您使用RESTful URL,則TempData是將郵件從POST操作轉移到GET操作的最佳實踐。考慮這個:

您在URL產品/新建表格。產品/創建表單,驗證表單並創建產品,在成功時,控制器重定向到URL產品/ 1,並在出錯時將重定向回產品/新建以顯示錯誤消息。

產品/ 1僅僅是該產品的標準GET動作,但我們想的消息顯示指示插入是成功的。 TempData對此非常完美。將消息添加到Post Controller中的TempData中,並在視圖中添加一些if邏輯並完成。

失敗我一直在formCollection中輸入值,並在Post Action中將一組錯誤消息添加到TempData中,並重定向到初始Action Prodcuts/New。 我已經添加了視圖的邏輯,用以前輸入的值填充表單輸入以及任何錯誤消息。對我來說似乎很好,很乾淨!

3

在MVC3中檢出sessionless controllers。事實證明,使用會話會阻止並行執行單個用戶的請求,從而導致性能下降。

由於tempdata默認使用會話,您將無法使用此功能。你可以切換到使用cookies作爲tempdata,但有點尷尬(至少對我而言)。儘管如此,它仍然比視圖狀態更清潔,所以也許它不是一個很大的破壞者。

0

所有好的答案,你看看這個傳遞消息。

的TempData和會話的arent REST風格的架構最好的主意,因爲大多數的會話存儲在內存中。因此,當您想使用服務器場時,用戶會話將存在於一臺服務器上,而其下一個請求可能會發送到另一臺服務器。

話雖這麼說,看看這個使用的TempData的在這裏傳遞消息。

http://jameschambers.com/2014/06/day-14-bootstrap-alerts-and-mvc-framework-tempdata/

Mabye這可以適應,如果僅用於重定向到另一個頁面提示使用查詢字符串的方法。

相關問題