2014-10-09 63 views
1

我創建了新聞網站MVC。 我有它的搜索功能。在這種情況下有什麼更好的? ViewBag或TempData或Session?

SearchControllerIndexAction被調用,它獲取記錄從database,它返回Search View. 這個搜索查看有AJAX Pager尋呼,點擊下一步或尋呼機上一個按鈕時,AJAX請求到Search ControllerPaging Action製成。

現在我不想再打電話給我的Database。我想使用在Search ControllerIndex action期間獲取的結果。

現在我已經使用Session[""]對象。

我想知道在這種情況下用於狀態管理的更好。

結果從數據庫中讀取的可繞1000-5000,ArticleNameArticleShortDescription(〜200個字符)

回答

2

你不應該使用任何這些。會話是爲每個用戶創建的,如果您爲每個使用您的搜索的用戶存儲1000 - 5000篇文章,那麼您的時間將會很糟糕。 ViewData基本上是一個帶有很好包裝的Session對象,所以它對你的用例也不好。

假設您決定使用HttpRuntime。緩存,而不是每個用戶的基礎上的所有結果,然後你必須擔心多久將對象存儲在緩存中。

邏輯的做法是查詢與分頁數據庫

爲了防止打你的數據庫如此頻繁,那麼你應該緩存與搜索詞+頁碼+頁的大小(選購),分頁結果緩存鍵,並將結果對象存儲爲緩存值,理想情況下使用緩存過期集。 (你不想提供陳舊的搜索結果,直到你的緩存被驅逐出去吧?)

+0

所提到的那樣當您說「使用分頁查詢數據庫」 ,我怎麼知道有多少記錄符合我的標準? – AK47 2014-10-09 08:39:49

+0

看看這個http://stackoverflow.com/a/18119680/670514 – 2014-10-09 08:40:57

+0

我知道這種方法,但什麼好?要麼帶一個額外的列(只有一個值)或緩存在.Net端? – AK47 2014-10-09 08:44:40

2

ViewBagViewData或僅在當前請求持久的。因此,它們不可用。 TempData一直存在,直到下一個請求,但這可能是任何事情,所以不能保證它持續足夠長的時間來進行Ajax調用(或後續的ajax調用)。

實際上,在這種情況下,Session是唯一不錯的選擇,但它仍然不是最佳選擇。 您將存儲批次的信息,甚至可能不會被客戶請求。即使那樣,在不再需要它時,清理它也可能很難。

最好的辦法是打電話給數據庫進行分頁記錄,這樣你只能返回每個請求的數據子集,而不是僅僅撥出全部的數據。

+0

感謝您的迴應,但我想避免再次調用數據庫。僅從數據庫中引入1頁記錄將阻止我應用分頁原因,只有1頁的記錄將在那裏,因此沒有應用分頁的意思。 – AK47 2014-10-09 08:32:55

+0

那麼,在這種情況下,您必須爲用戶特定的數據使用'Session',或者針對全局/公共數據使用'Application Cache',正如@fordio – Kippie 2014-10-09 08:34:09

1

我避免使用會話狀態,因爲它會影響應用程序在負載平衡環境中的伸縮程度。您必須確保用戶總是從同一臺服務器獲得請求,因爲這是存儲會話狀態的地方(除非您將其放入數據庫中,但會在您的情況下失敗)。

我會嘗試使用應用程序緩存。這意味着,如果用戶單擊「下一步」或「上一步」,並且該請求是從另一臺服務器提供的,則必須再次訪問數據庫 - 但是我個人更傾向於選擇該命中。

看看this page,特別向下滾動到應用程序緩存部分。

希望這會有所幫助。

相關問題