2011-02-25 75 views
3

因此,對於如何在多個頁面之間傳遞數據的問題似乎沒有任何明確的答案。在完成了一些小作業之後,爲什麼(或者至少我已經蒐集到):ASP.NET在多個頁面之間傳遞數據會話

  1. ViewState變量不會在頁面之間持續存在。
  2. 會話變量是不穩定的,必須謹慎使用。
  3. Cookie存在潛在的安全問題,需要時間並且必須保持較小。
  4. 在URL中存儲變量對數據量有限制並且可能不安全。
  5. 存儲瓦爾暫時在DB是一個真正的皮塔因爲每次你可能可以傳遞到另一個頁面對象添加一個表。

    到目前爲止,這是尋找像我將使用隱藏域的keyid的和唯一的ID傳遞到下一個頁面,然後檢索數據庫中的數據。你對這一切有什麼想法?什麼是最好的方式去做任何它?我很早就開發這個應用程序,所以現在做出改變是首選。

編輯:我期待了很多使用該應用程序在任何一個時間的用戶,這是否會影響我是否應該使用基於會話的SQL Server?

回答

1

會話變量應該適合您的需求。

我會去與StateServer或SQLServer會話狀態模式。使用InProc模式是最快的,但它有一些問題(包括所有用戶會話在推送新的二進制文件時被丟棄,web.config發生變化等)。會話波動很大,但您可以通過多種方式控制波動率。會話需要cookie,除非它們被配置爲無cookie(我強烈建議您遠離),但我認爲這是一個合理的要求。

此外,您還可以創建從中創建可在會話變量存儲對象結構或序列化類。結構或類將允許您將所有數據保存在一個位置 - 只有一個會話變量需要擔心。

任何方法都有優點和缺點,全部是關於尋找最佳方法的方法。我希望這有幫助。

3

我認爲上下文在這裏很重要,例如,你想在頁面之間傳遞什麼?爲什麼?

如果您在處理複雜的多部的形式,那麼你就可以實現單頁的形式,簡單地顯示或隱藏相關元素。儘可能多地使用用戶控件和自定義控件以促進隔離和可重用性。這使得全面的生活變得更容易。

凡是是用戶生成的是幾乎肯定會在數據庫中上而已 - 所以#5似乎並不相關。那就是你不應該將數據「暫時」存儲在數據庫中 - 哪些數據需要在不屬於你的應用程序的頁面之間保存。

其他任何東西似乎是會話相關的,並沒有那麼多的數據。

,如果我知道具體是什麼你處理我可以添加一些更多的心思。

噢 - 「Cookie存在潛在的安全問題並需要時間」 - 除非您不想識別回訪者,否則您將使用Cookie。任何潛在的安全問題只會是糟糕實施的結果,並且肯定會在隱藏領域傳遞數據並不會更好。你真的不想編寫一個ASP.NET應用程序,這個應用程序是圍繞發佈到其他表單以外的頁面設計的。由於許多原因,這只是一個令人頭痛的問題,我不能想到將其作爲基本應用程序設計的一部分來實現這一目標的好處。

+0

+1。這種類型的事情不能真正在上下文之外進行評估。另外你的其他觀點正確。 – NotMe 2011-02-25 18:18:19

5

如果你想保持狀態,是的,因爲你不必擔心過期。 Session是相似的,除非您必須擔心Session到期。在這兩種情況下,將相似數據寫入同一區域的併發呼叫都可能導致問題並需要進行覈算。

Session很好,當你不必擔心多個Web服務器或超時問題。數據庫爲您提供了更多的可伸縮性,但是需要花費大量的數據庫讀/寫操作,並且您必須考慮清理。

個人而言,我會嘗試使用以下決策樹:

  1. 簡單,簡短而不是私人數據 - >查詢字符串
  2. 是數據不太簡單,但只需要很短的存在
  3. 將需要>會議
  4. 數據跨多個區域,對長時間內持續 - - 時間>數據庫

當然,還有更多的是,這卻應該GI由於您剛剛開始,所以請您提供一些基本的注意事項。把事情簡單化。如果簡單的查詢字符串就足夠了,不要試圖過度設計解決方案。只要你保持簡單就可以開始,你總是可以延遲工程。

+1

+1 - 我喜歡你的基本決策樹,很好的方法來解決它。我只會添加查詢字符串應該只是用於「獲取」。也就是說,在目標頁面加載時,不要使用查詢字符串中的任何內容來確定數據庫更新操作。搜索引擎,書籤,不涉及正確條件的代碼,都會導致你的問題。 – 2011-02-25 18:28:12

0

所有的方法都有其優點和缺點。這一切都取決於你正在工作的場景。

如果在合理範圍內使用,會話變量的工作情況會非常好。交通繁忙網站中的InProc會話可能會迅速耗盡您的資源,但您始終可以切換到基於SQL Server的會話,以便大部分數據庫爲您工作。

+0

我期待在任何時間使用本網站的大量用戶。 @凱爾西提到了數據庫讀/寫帶來的問題,這就是我現在所處的位置。每次我想傳遞數據時,讀/寫似乎都很成問題,然後再以某種方式清理。基於Sql Server的Session是否爲我做這件事?我將如何設置? – 2011-02-25 18:24:21

+0

創建一個數據庫表,該表將存儲每個用戶需要的任何數據。創建一個模型化該表的結構體或可序列化的類。當有人登錄時,從數據庫加載他們的記錄,填充結構或對象,並將其存儲在會話變量中。如果他們的數據在登錄時更改,請更新相應的數據庫行。我建議使用可序列化的類,以便可以定義進行數據庫調用的方法(例如,加載用戶,更新用戶等)。 – 2011-02-25 18:31:14

+0

仍然不確定你在這裏掙扎着什麼。您需要在基本會話/授權信息之外的任何常規頁面之間傳遞哪些數據?另外,在考慮建築是好事的時候,不要過時。先寫好代碼。稍後優化。如果/出現性能問題時,很容易換掉存儲數據的機制(假設您遵循DRY原則)。數據庫速度非常快,硬件也比程序員時間便宜。 – 2011-02-25 18:32:18