由於之前一直在從事管理的工作,比較長一段時間沒有寫Asp.net的頁面展現和控制邏輯了,今天準備趕一個開發進度時候,在需要使用資料繫結控制項和XmlDataSource控制項時遇到了一點小問題。由於當前的XmlDataSource控制項的資料來源不能直接通過指定檔案的形式來綁定,所以考慮在後台通過動態綁定來實現。結果沒有想到一個小功能盡然弄了快2個小時,汗!~以下是我遇到的問題,做個記錄:
項目中需要做一個頁面的列表展現,於是我就直接使用了一個ListView控制項作為資料繫結控制項,在提供的資料行中有一個欄位在資料庫中是Xml類型的欄位,這個欄位儲存著一個內部的子結構。 在列表展現的時候需要把這個子結構也一起按某種約定的樣式呈現出來。於是我就考慮了在ListView的模板列中嵌套了一個Repeater控制項,用來呈現這個子結構;並且考慮這個資料來源是Xml結構的,因此我想到需要使用一個XmlDataSource控制項來做輔助解析。結果問題就來了。首先在頁面上我給Repeater控制項的DataSourceId指定為XmlDataSource的控制項Id,而XmlDataSource的資料通過在後台ListView控制項的ItemDataBound事件來動態指定。結果一測試發現竟然拋出“未將對象引用設定到對象的執行個體”錯誤,通過異常資訊發現在XmlDataSource控制項載入Xml資料的時候出錯了,為什麼會這樣呢?最後發現如果在頁面中給資料繫結控制項(如Repeater等)指定了DataSourceId,而XmlDataSource定資料是在這個資料繫結控制項的ItemDataBound事件中動態指定的就會發生這個異常。於是我就把頁面中的DataSourceId指定去掉了;換成在ItemDataBound事件中給XmlDataSource賦完Data屬性後再指定控制項的DataSourceId屬性。調試運行一下沒有異常了,但好像資料出不來,怎麼回事呢?可能是Xml的XPath寫的不對,仔仔細細查看了許多遍都沒有發現自己寫錯了呀!靠!!!難道碰到鬼了。MD死馬就當活馬醫了,不會是在這個Repeater控制項上還要調用DataBind方法,反正試試總不會損失什麼的,結果一試竟然可以顯示了。冊那~問題終於解決了。