我剛剛開始學習ASP.NET MVC,我想知道如何在後續對控制器操作方法的請求之間保留模型對象?如何在使用ASP.NET MVC的請求之間持久化對象?
例如說,我正在創建一個聯繫人列表Web應用程序。用戶可以在列表中創建,更新,重命名和刪除聯繫人。但是,我也希望用戶能夠上傳從其他程序導出的聯繫人列表。然而,我不想只是自動添加上傳文件中的所有聯繫人,我想給用戶一個輔助表格,他們可以選擇哪些上傳的聯繫人應該實際添加到他們的列表中。
所以首先我有一個ContactController.Upload()
方法,它顯示一個上傳表單。這提交至ContactController.Upload(HttpPostedFileBase file)
,該文件讀取發佈到一組Contact模型對象中的文件。然後我想要顯示列表中所有聯繫人的名稱列表,並允許用戶選擇應添加到聯繫人列表中的聯繫人列表。這可能是一個很長的列表,需要分成多個頁面,我也可能希望允許用戶在聯繫人實際添加到他們的聯繫人列表之前編輯聯繫人的詳細信息。
我應該在用戶上傳文件和最終提交他們想要的特定聯繫人之間保存模型對象?我寧願不立即將所有上傳的聯繫人加載到後端數據庫中,因爲用戶可能最終只選擇一小部分來實際添加。其餘的則需要刪除。另外,我必須考慮用戶上傳文件時的情況,但從未實際完成上傳。
從我所瞭解的控制器實例只能持續一個請求。那麼我應該在包含所有最新上傳的聯繫人模型對象集合的聯繫人控制器上創建一個靜態屬性?然後有一些過程定期檢查這些集合的年齡,並清除那些比指定的過期時間早一些的年齡?
我不關心丟失數據。如果用戶上傳文件,並且他們的瀏覽器崩潰,如果他們不得不再次上傳文件,那麼它不是世界的盡頭。怎麼樣使用TempData或Session?儘管如果我使用會話狀態模式,然後在proc我的UploadData模型對象將需要可序列化正確嗎?如果它有什麼不同,這些上傳的文件大約200kb到1mb。當然,我可能只是在想這個,因爲這是我第一個ASP.NET網站。 – 2011-04-17 00:45:23
'TempData'基本上是會話周圍的一個包裝器,它會自動刪除下一個請求AFAIK中的信息。重點不在於再次上傳文件:這是**編輯失去了 - 這可能是非常煩人的。對象不需要可序列化 - 畢竟,它們沒有被序列化。 1MB不是太小。我真的不明白你爲什麼不寫這個數據庫。 – mnemosyn 2011-04-17 00:57:29
那麼我結束了一個稍微不同的解決方案。當用戶上傳文件時,服務器只保存文件,並觸發線程池上的工作項目以實際讀取文件並將數據加載到數據庫中。這樣,當服務器讀取文件時,這個用戶不會等待他們的瀏覽器響應。 – 2011-05-26 18:23:12