C#重載LoadPostData方法
為了在***次回寄和所有隨后的回寄中實(shí)現(xiàn)同步,ASP.net在IPostBackDataHandler接口的實(shí)現(xiàn)中提供了一個(gè)LoadPostData方法。在每一次回寄時(shí)都要調(diào)用LoadPostData方法;因此,你需要在此做一些工作。
值得一提的是,ASP.NET 2.0修整了一個(gè)在1.1版本中被忽視的小地方,然而這一修改能夠使你的工作容易許多。ASP.NET ListBox控件已經(jīng)在兩個(gè)版本(1.1和2.0)中實(shí)現(xiàn)了IPostBackDataHandler接口。但是在2.0版本中,微軟使這個(gè)接口的方法定義虛擬化(virtual,在VB中稱作Overridable)。這意味著,你不必在EnhancedListBox控件中重新實(shí)現(xiàn)這個(gè)接口;而是,你僅需C#重載LoadPostData方法。
更重要的是,這也意味著,你可以存取基類實(shí)現(xiàn)而不必創(chuàng)建所有已經(jīng)存在于你的擴(kuò)展控件中的功能。什么功能呢?這包括微軟加于其中的一切:用于處理 Item集合,SelectedIndex,SelectedValue和SelectedItem屬性,及其它許多執(zhí)行ListBox控件功能的代碼。在ASP.NET 1.1中,你必須在你的派生控件中實(shí)現(xiàn)這個(gè)接口并且要提供你自己對(duì)這兩個(gè)方法的定義代碼,不僅包括你自己的加入的代碼而且還要重復(fù)微軟已經(jīng)在其控制中所實(shí)現(xiàn)的一切。
我猜測(cè),微軟有人已經(jīng)發(fā)現(xiàn)了他們的實(shí)現(xiàn)中的錯(cuò)誤,并且把方法變?yōu)関irtual的,這樣開(kāi)發(fā)者能夠存取基類的代碼。因此,在源碼列表6中向你展示如何實(shí)現(xiàn)C#重載LoadPostData方法。在這個(gè)重載中,你將首先調(diào)用基類實(shí)現(xiàn)代碼;然后,加上你需要的代碼以與Item集合同步。
另外,你還可以利用ListBox控件—通過(guò)把它編寫(xiě)成一個(gè)復(fù)合控件。此時(shí),你需要把ListBox中的每一個(gè)屬性映射到你的EnhancedListBox以便使它成為L(zhǎng)istBox控件的一個(gè)投放位置點(diǎn)位符。無(wú)論使用哪一種方法,或者通過(guò)LoadPostData方法的重新創(chuàng)建,你都仍然需要寫(xiě)很多代碼。如果我專門(mén)為ASP.NET1.1編寫(xiě)這個(gè)控件,那么我很可能采取最直接的方案:復(fù)合控件方案。
LoadPostData方法使你能夠存取寄送到服務(wù)器的每一個(gè)域,包括你的隱藏文本域(存儲(chǔ)在要傳遞到這個(gè)方法的postCollection參數(shù)中)。你可以問(wèn):為什么需要該隱藏文本域,而不是使用這個(gè)參數(shù)來(lái)存取被回寄的< select>元素呢?現(xiàn)在,我作一下解釋。首先,回顧一下典型的ASP時(shí)代,當(dāng)時(shí)你使用Request.Form屬性來(lái)存取頁(yè)面域。在回寄時(shí),你能夠存取一個(gè)< select>元素的唯一的部分是選擇的項(xiàng)。在該方案中,你需要完整的列表內(nèi)容(因此,包括隱藏的文本域)。列表6向你展示如何分析該隱藏的文本域的內(nèi)容并且把Item重新添加到Item集合中。注意,你是怎樣調(diào)用基類實(shí)現(xiàn)的。
***,在你***次生成控件時(shí),你必須構(gòu)建這個(gè)隱藏的文本域,以防在任何重排序前發(fā)生頁(yè)面回寄。Render方法的***一行是:
- output.Write("<script language='JavaScript'>BuildItemList
(document.all." + this.ClientID +",document.all.__" + this.ClientID +");- </script>");
你可以在列表1的***看到這一點(diǎn)。
現(xiàn)在,你可以使用EnhancedListBox控件來(lái)重排序一些項(xiàng),回寄,并且確保在重新生成頁(yè)面前,控件的服務(wù)器存儲(chǔ)與在客戶端被改變的客戶端存儲(chǔ)完全同步。因此,現(xiàn)在讓我們使用相同的技術(shù)來(lái)構(gòu)建一個(gè)復(fù)合控件ListMover。 以上介紹C#重載LoadPostData方法。
【編輯推薦】