近日在 ASP.NET 2.0 中使用以前用 .NET 1.1 開發的一個WebControls動態庫,其中有兩個控制項分別是繼承自 DataGrid 和 DataList,發現出現如下的建立錯誤:
這個控制項在ASP.NET 1.1裡都是正常的。如果不去管這個錯誤,也是可以照常使用,在啟動並執行時候也一切正常。
從問題的描述來看,"make sure all properties are valid.",好像是說控制項的屬性有問題。把代碼仔細地檢查了一遍,還是沒發現什麼錯誤。難道是ASP.NET 2.0中針對WebControl的某些變化導致了這個建立錯誤?但運行時並沒有錯啊。。
這個時候無意中選擇了SmartTag中的"AutoFormat"功能,卻意外的發現另一個錯誤提示:
"Cannot create an object of type 'Hooyee.Utils.PagerInfo'" from its string representation '' for the 'PagerInfo' property. "
是說無法通過 PagerInfo 屬性的Null 字元串值建立 PagerInfo 對象。原來就是這個Property有錯誤。
PagerInfo是一個用於儲存和計算分頁資訊的類。由於我的DataList支援分頁功能,所以添加了這樣一個屬性。
從我的理解來看,系統可能想把PagerInfo屬性d的內容以文本形式儲存在html裡,然後又通過這個字串值來還原序列化或者重新建立一個PagerInfo執行個體。而我的PagerInfo類並未實現序列化或重載ToString()方法,所以也就無法把它的值儲存成string類型。
因為PagerInfo這個屬性本身就沒有必要儲存在html裡,所以我的解決方案是在這個屬性前面加一個DesignerSerializationVisibilityAttribute,這個特性用於控制某個屬性在設計時怎樣進行序列化。我這裡是Hidden,不讓它序列化。
[DesignerSerializationVisibility( DesignerSerializationVisibility.Hidden )]
public PagerInfo PagerInfo { get { return _pagerInfo } }
重新編譯後,問題解決。至於通過為 PagerInfo 類添加序列化功能,我還沒試過,我想應該也能解決這個問題。有興趣的朋友可以試一下。
__________________________________ 2005/01/25 02:45
關於本文提到的 AdvDataList 控制項以及 PagerInfo 類,都是在 WebPager 翻頁控制項裡用到的。該控制項現已提供源碼下載。
一套可嵌入或獨立使用的翻頁控制項: WebPager(附源碼)