Tip:使用Extender的ResolveControlID事件
1、分析
不知道大家在使用ASP.NET AJAX Control Toolkit里的各個Extender控件時,有沒有接觸過ResolveControlID事件?這個事件在官方也只用了很少的筆墨來描述。的確,這個事件不太常用,看看ASP.NET AJAX的演示站點,根本沒有使用過ResolveControlID事件。
那么這個事件難道沒有什么用嗎?其實不然。這個事件原本不存在于ASP.NET AJAX中,是ASP.NET AJAX Control Toolkit為了方便Extender的開發,而是現在ExtenderControlBase類里的。ASP.NET AJAX Control Toolkit是個非常重要的東西,他提供的ExtenderControlBase類基于ASP.NET AJAX中的ExtenderBase類,提供了許多有用的擴展,大大方便了Extender的開發。ResolveControlID事件就是其中一個。它的作用是幫助Extender找到它需要的控件。
每個Extender控件都會有XXXXID屬性(例如TargetControlID),它們在開發是都會使用IDReferenceAttribute進行標注,這說明這些屬性的“含義”并非只是一個簡單的字符串,它們的作用是表示一個控件。換句話說,就是在Extender工作時提供它所需要的各個控件。大家平時在使用Extender控件時,往往會把Extender和它需要的控件放在同一個Web User Control或者Page中,這時只要為那些ID屬性指定對應的控件ID即可。但是如果Extender需要的控件和Extender本身并不在同一個Web User Contorl或Page中時,該如何告訴Extender,應該使用哪些控件呢?
這就是ResolveControlID事件的作用了。如果要說得更加“專業”一些,ResolveControlID事件的作用是幫助Extender找到不同Naming Container中的控件。Naming Container是ASP.NET頁面模型的概念,它提供了一種“容器”,目的是能夠封裝一些控件,使不同容器間的控件不會因為某些原因而產生沖突(例如服務器端ID)。有了Naming Container,我們可以在頁面上放置多個Web User Control,而每個Web User Control中很有可能會有相同服務器ID的控件,但是它們不會互相沖突。一個Naming Container就是一個實現了INamingContainer接口的控件,它沒有任何方法,它的作用僅僅是為了“標記”。我們平時接觸的Control類和Page類都是先了這個接口,也就是說它們都是Naming Container。
如果我們在瀏覽器中查看頁面中HTML元素的ID,經常可以發現有“xxxx$xxxx$xxx…”這種形式的ID,這也是Naming Container的作用,它也能保證了每個HTML元素的客戶端ID的唯一性。而控件的客戶端ID可以通過它在服務器端的ClientID屬性獲得,不過這就是另外的話題了。
那么ResolveControlID事件是如何生效的呢?ResoveControlID的“事件”參數類型為ResolveControlEventArgs類型,它有一個可寫的Control屬性。當Extender無法在自己所在的Naming Container中找到控件時,就會觸發ResolveControlID事件,然后使用“事件”參數的Control屬性作為找到的控件。我們要做的就是在響應這個事件時設定ResolveControlEventArgs.Control屬性,給定合適的控件。
其實ResolveControlID事件就是這么簡單。
?
2、示例
其實聽了上面的描述,相信大家已經知道如何響應ResolveControlID事件了。不過在這里,我想用一種比較統一的解決方案來實現ResolveControlID。
Naming Container其實也就是包含了其它控件,自然可以是別的Naming Container,因此會形成了“級別”。我們不如把這樣的“級別”通過指定Extender的那些ID屬性描述出來,然后可以順著Naming Container的級別一直找下去。具體的做法,我們通過一個使用ModalPopupExtender的示例來看一下吧。
首先,我們要形成不同的Naming Container。那么在這里,我們把彈出的Panel、OK Button以及Cancel Button放在一個Web User Control中,如下:
<asp:Panel ID="ModalDialogPanel" runat="server" Width="300" style="padding: 10px; border:solid 1px black;">ASP.NET AJAX is a free framework for building a new...<br /><br /><asp:Button ID="OkButton" runat="server" Text="OK" /><asp:Button ID="CancelButton" runat="server" Text="Cancel" /> </asp:Panel>?
然后就在Page里使用ModalPopupExtener了,請注意,我們為那些ID屬性指定了使用逗號分割的字符串,這種方法就表示了Naming Container的級別。例如PopupControlID為“ModalDialog, ModalDialogPanel”,就表示了彈出的控件是ID為ModalPopupDialog的Naming Container(ModalDialog控件)里的ModalDialogPanel控件(可以在ModalDialog.ascx文件中找到)。如下:
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager><asp:LinkButton ID="LinkButton1" runat="server">Click Here to Popup a Modal Dialog </asp:LinkButton><ajaxToolkit:ModalPopupExtender ID="ModalPopupExtender" runat="server"TargetControlID="LinkButton1"PopupControlID="ModalDialog, ModalDialogPanel"OkControlID="ModalDialog, OkButton"CancelControlID="ModalDialog, CancelButton"OnResolveControlID="ModalPopupExtender_ResolveControlID" /><uc1:ModalDialog ID="ModalDialog" runat="server" />?
最后就似乎要響應ResolveControlID事件了,相信大家能夠很輕松的得出它的實現方式。如下:
protected void ModalPopupExtender_ResolveControlID(object sender, ResolveControlEventArgs e) {if (e.ControlID == null) return;string[] controlIds = e.ControlID.Split(',');Control result = this;foreach (string id in controlIds){result = result.FindControl(id.Trim());}e.Control = result; }?
其實ResolveControlID事件的作用和實現就是這么簡單。下面就是使用效果:
?
點擊這里下載示例文件。
轉載于:https://www.cnblogs.com/JeffreyZhao/archive/2006/12/31/ResolveControlID_Event.html
總結
以上是生活随笔為你收集整理的Tip:使用Extender的ResolveControlID事件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 自己动手编写一个ajax extende
- 下一篇: Asp.net2.0 学习资源(转载)