2011-04-16 32 views
1

我剛剛開始學習ASP.NET MVC,我想知道如何在後續對控制器操作方法的請求之間保留模型對象?如何在使用ASP.NET MVC的請求之間持久化對象?

例如說,我正在創建一個聯繫人列表Web應用程序。用戶可以在列表中創建,更新,重命名和刪除聯繫人。但是,我也希望用戶能夠上傳從其他程序導出的聯繫人列表。然而,我不想只是自動添加上傳文件中的所有聯繫人,我想給用戶一個輔助表格,他們可以選擇哪些上傳的聯繫人應該實際添加到他們的列表中。

所以首先我有一個ContactController.Upload()方法,它顯示一個上傳表單。這提交至ContactController.Upload(HttpPostedFileBase file),該文件讀取發佈到一組Contact模型對象中的文件。然後我想要顯示列表中所有聯繫人的名稱列表,並允許用戶選擇應添加到聯繫人列表中的聯繫人列表。這可能是一個很長的列表,需要分成多個頁面,我也可能希望允許用戶在聯繫人實際添加到他們的聯繫人列表之前編輯聯繫人的詳細信息。

我應該在用戶上傳文件和最終提交他們想要的特定聯繫人之間保存模型對象?我寧願不立即將所有上傳的聯繫人加載到後端數據庫中,因爲用戶可能最終只選擇一小部分來實際添加。其餘的則需要刪除。另外,我必須考慮用戶上傳文件時的情況,但從未實際完成上傳。

從我所瞭解的控制器實例只能持續一個請求。那麼我應該在包含所有最新上傳的聯繫人模型對象集合的聯繫人控制器上創建一個靜態屬性?然後有一些過程定期檢查這些集合的年齡,並清除那些比指定的過期時間早一些的年齡?

回答

0

您也可以使用HttpContext.Cache,它支持到期(和滑動到期)開箱即用。

或者,也許甚至更好(但更多的工作),你可以使用cookie,並讓用戶在瀏覽器中使用JavaScript修改數據,然後再發布給你。

但是,我會堅決推薦將上傳的信息存儲在數據庫中。

正如您所指出的那樣,它可能是大量數據,用戶可能希望在點擊'確認'之前對其進行編輯。如果用戶的機器(或瀏覽器)崩潰或她不得不緊急離開,會發生什麼?

根據存儲數據的方式,這種情況下的數據可能會丟失。即使您將用戶標識用作緩存鍵,服務器重新啓動,緩存過期或緩存溢出也會導致數據丟失。

最好的解決方案可能是將數據庫保存在臨時集合中的數據庫和cookie存儲的組合。每分鐘分鐘或分頁時,修改的數據被髮送到服務器並在數據庫中更新。

+0

我不關心丟失數據。如果用戶上傳文件,並且他們的瀏覽器崩潰,如果他們不得不再次上傳文件,那麼它不是世界的盡頭。怎麼樣使用TempData或Session?儘管如果我使用會話狀態模式,然後在proc我的UploadData模型對象將需要可序列化正確嗎?如果它有什麼不同,這些上傳的文件大約200kb到1mb。當然,我可能只是在想這個,因爲這是我第一個ASP.NET網站。 – 2011-04-17 00:45:23

+0

'TempData'基本上是會話周圍的一個包裝器,它會自動刪除下一個請求AFAIK中的信息。重點不在於再次上傳文件:這是**編輯失去了 - 這可能是非常煩人的。對象不需要可序列化 - 畢竟,它們沒有被序列化。 1MB不是太小。我真的不明白你爲什麼不寫這個數據庫。 – mnemosyn 2011-04-17 00:57:29

+0

那麼我結束了一個稍微不同的解決方案。當用戶上傳文件時,服務器只保存文件,並觸發線程池上的工作項目以實際讀取文件並將數據加載到數據庫中。這樣,當服務器讀取文件時,這個用戶不會等待他們的瀏覽器響應。 – 2011-05-26 18:23:12

1

控制器上的靜態屬性有問題。首先,它不適用於網絡農場,其次它必須處理來自不同用戶的多個請求。如果你真的不想使用你的數據庫,你可以使用ASP.NET Session。

+0

是的靜態屬性似乎是一個壞主意。我應該使用Session還是TempData?我正在閱讀有關兩者,但不確定其中的差異。 – 2011-04-17 00:16:01

+0

@Eric Anastas - http://stackoverflow.com/questions/1500402/when-to-use-tempdata-vs-session-in-asp-net-mvc – jfar 2011-04-17 01:47:59

1

不,您不需要靜態屬性,因爲對於控制器的所有實例(即使對於其他用戶來說)都是靜態的。

相反,您應該創建一個用於上傳數據的表。此表格將用作用戶上傳數據和完成此過程之間的中介。完成後,您將要保留的聯繫人複製到永久表中,然後刪除臨時數據。然後,您可以每隔一段時間運行一個進程,以清除不早於指定時間限制的不完整數據。

0

將數據存儲在會話或內存中的問題是,如果用戶上傳50k或更多的聯繫人,會發生什麼情況。然後在內存中有一個非常大的數據集來處理這些數據,這取決於您的平臺可能會影響應用程序的性能。

如果這不會成爲問題,並且導入的聯繫人列表的大小可管理,則可以使用會話或緩存來存儲數據集以供進一步修改。只要記住要在用戶提交更改時清除它,您不希望在會話中出現幾個沉重的數據集。

如果您使用應用程序控制器將數據集存儲在會話中,那麼在需要時它將可用於所有控制器。

相關問題