2012-11-23 43 views
3

我正在創建一個擴展WebControl的自定義控件。該網絡控制允許用戶定義的列中標記的集合,是這樣的:在哪裏存儲網絡自定義控制數據

<Custom:CustomGrid> 
<Columns> 
    <Custom:DataColumn HeaderText="FirstName" /> 
    <Custom:DataColumn HeaderText="LastName" /> 
</Columns> 

,並把一個IEnumerable在DataSource屬性,這呈現出的表。 該控件還允許分頁。 DataSource中的IEnumerable是完整列表,我一次顯示列表的一個頁面。我已經將當前頁面,每頁的行數等保存到視圖狀態。我是否也應該在視圖狀態下放置完整列表?也許會話? 這個列表可能會變得有點沉重。也許保存會話中的隨機密鑰,它保存在視圖狀態? 這裏最好的做法是什麼?

編輯:我不認爲這是正確的強加IEnumerable中的所有類型都是可序列化的。這是公平的嗎?那麼我是否需要將數據源複製到其他數據結構進行序列化?

編輯2:即使我使用一個基本控制,而不是實施RenderChildControls我將需要實現的CreateChildControls,但我仍然需要在一些地方仍然存在的數據,還是我錯過了基類的點?

回答

2

的確,並非所有的IEnumerable實例都是可序列化的。

如果查詢運行起來很便宜,我不會保留整個數據集,只是針對不同的頁面再次運行查詢或按排序順序進行更改。

如果你把數據放在viewstate中,你最終會得到巨大的頁面。如果您沒有很多用戶,會話狀態可能是可以接受的,但是擁有大量用戶的大型數據集不能很好地擴展。如果我將一百萬行綁定到您的控件,該怎麼辦?或者,如果您的控件用於中繼器並在頁面上顯示100次,該怎麼辦?

您確定需要保存數據嗎?這不是過早的優化嗎?

請記住,您的控件是一個UI組件。視圖狀態應該擁有足夠的信息來保持UI狀態。狀態改變(例如:切換到不同頁面的結果)是控制應將責任傳遞給數據源的事情。

看看好老GridView。它顯示你給它並記住的內容。如果您正在使用分頁,則會引發一個事件,說「用戶已更改頁面;給我數據頁面x」。對我而言,這是UI控件的最佳做法。

+0

這或多或少是我最終做的。由於數據集不是很大,我只是將每次回發中設置DataSource屬性的責任傳遞給耗用頁面,並且我僅將ViewState存儲到需要將DataSource帶到其先前狀態的內容中。 –

0

爲了實現數據綁定控制,最好使用設計用於執行此類任務的基類。例如在ASP.NET中存在CompositeDataboundControl,它可以用作基類來實現自定義數據綁定控件。我可以建議您查看以下Dino Esposito文章: http://msdn.microsoft.com/en-us/library/aa479016.aspx

基本上,如果你創建像ASP.NET的GridView的控件,那麼它是存儲在viewstate的值。更清楚的是創建了DataRow控件的數量,這些控件在視圖狀態下保存了指定的值。在回發過程中,它重新創建相同數量的行,並從viewstate恢復值。如果您僅在會話中保存數據源而不使用viewstate,那麼您將需要在每次回發期間將數據重新綁定到您的網格。因此,如果您創建類似於gridview的服務器控件,那麼Dino Esposito文章中描述的方法將非常有用,因爲它顯示瞭如何創建類似於ASP.NET Server GridView控件的控件。

+0

那麼我的大多數控件都是手動呈現的(並且是純HTML,而不是服務器控件),所以我不能指望控件保留自己的viewstate。 –