ASP.NET AJAX示例:下拉列表
ASP.NET AJAX示例:鏈接的下拉列表
本文的開(kāi)始簡(jiǎn)要地討論了用于鏈接兩個(gè) DropDownList 的兩種傳統(tǒng)方法。當(dāng)選定的索引更改時(shí),返回頁(yè);或者將所有可能的數(shù)據(jù)加載到 JavaScript 數(shù)組并動(dòng)態(tài)顯示。希望您可以看到 AJAX 如何替代這兩種解決方案。
首先,讓我們來(lái)看一下我們的數(shù)據(jù)界面,并從該數(shù)據(jù)界面驅(qū)動(dòng)示例。我們的數(shù)據(jù)訪問(wèn)層將提供兩種方法:***種方法將檢索系統(tǒng)支持的國(guó)家/地區(qū)的列表,第二種方法將獲取國(guó)家/地區(qū) ID 并返回州/省的列表。由于這是純數(shù)據(jù)訪問(wèn),因此我們只需要使用方法。
- //C#
- public static DataTable GetShippingCountries();
- public static DataView GetCountryStates(int countryId);
- 'VB.NET
- Public Shared Function GetShippingCountries() As DataTable
- Public Shared Function GetCountryStates(ByVal countryId As Integer)
- As DataView
現(xiàn)在,讓我們轉(zhuǎn)到相反面,創(chuàng)建簡(jiǎn)單的 Web 窗體。
- < asp:DropDownList ID="countries" Runat="server" />
- < asp:DropDownList ID="states" Runat="server" />
- < asp:Button ID="submit" Runat="server" Text="Submit" />
Page_Load 事件同樣簡(jiǎn)單,和前述的 Web 窗體一樣。我們使用數(shù)據(jù)訪問(wèn)層來(lái)檢索可用的國(guó)家/地區(qū),并將其綁定到 countriesDropDownList 中。
- //C#:ASP.NET AJAX示例
- if (!Page.IsPostBack)
- {
- countries.DataSource = DAL.GetShippingCountries();
- countries.DataTextField = "Country";
- countries.DataValueField = "Id";
- countries.DataBind();
- countries.Items.Insert(0, new ListItem("Please Select", "0"));
- }
通常,代碼到此為止。首先,我們將創(chuàng)建要從 JavaScript 調(diào)用的服務(wù)器端函數(shù)。
- 'VB.NET:ASP.NET AJAX示例
- < Ajax.AjaxMethod()> _
- Public Function GetStates (ByVal countryId As Integer) As DataView
- Return DAL.GetCountryStates(countryId)
- End Function
這與您通常使用的任何其他函數(shù)一樣:它需要我們想要獲得的國(guó)家/地區(qū)的 ID,并將該請(qǐng)求傳遞給 DAL。唯一的不同是我們已使用 AjaxMethodAttribute 標(biāo)記了該方法。***剩余的服務(wù)器端步驟是通過(guò)調(diào)用 RegisterTypeForAjax 使用 Ajax.NET 來(lái)注冊(cè)包含上述方法的類(lèi)(在此情況下,是我們的下面的代碼)。
- //C#
- Ajax.Utility.RegisterTypeForAjax(typeof(Sample));
- 'VB.NET
- Ajax.Utility.RegisterTypeForAjax(GetType(Sample))
我們已基本完成;剩余的就是從 JavaScript 調(diào)用 GetStates 方法和處理響應(yīng)。當(dāng)用戶(hù)從國(guó)家/地區(qū)列表中選擇新項(xiàng)時(shí),我們想在邏輯上調(diào)用 GetStates。為此,我們將觸發(fā) JavaScript onChange 事件。這樣就稍微更改了我們的 Web 窗體代碼。
- < asp:DropDownList onChange="LoadStates(this)"
- ID="countries" Runat="server" />
JavaScript LoadStates 函數(shù)將負(fù)責(zé)通過(guò)由 Ajax.NET 創(chuàng)建的代理發(fā)出異步請(qǐng)求。請(qǐng)記住,默認(rèn)情況下,Ajax.NET 創(chuàng)建的代理的格式為 < RegisteredTypeName>.< ServerSideMethodName>。在我們的示例中,將為 Sample.GetStates。我們還想傳入國(guó)家/地區(qū) ID 參數(shù)和完成服務(wù)器端函數(shù)后 Ajax.NET 應(yīng)調(diào)用的回調(diào)函數(shù)。
- //JavaScript:ASP.NET AJAX示例
- function LoadStates(countries)
- {
- var countryId = countries.options[countries.selectedIndex].value;
- Sample.GetStates(countryId, LoadStates_CallBack);
- }
***一個(gè)步驟是處理我們的 LoadStates_CallBack 函數(shù)中的響應(yīng)。Ajax.NET 最有用的功能大概是它支持很多 .NET 類(lèi)型(我已經(jīng)多次提到這一點(diǎn))?;仡櫼幌路祷?DataView 的服務(wù)端函數(shù)。JavaScript 知道 DataView 什么?什么也不知道,但是 JavaScript 是面向?qū)ο蟮恼Z(yǔ)言,而且 Ajax.NET 不只能夠創(chuàng)建與 .NET DataView 相似的對(duì)象,還能將該函數(shù)返回的值映射到 JavaScript 副本。您應(yīng)該記住 JavaScript DataView 只不過(guò)是實(shí)際 DataView 的副本,目前除了能夠遍歷行和訪問(wèn)列值以外不支持其他更多功能(例如設(shè)置 RowFilter 或 Sort 屬性的功能)。
- function LoadStates_CallBack(response)
- {
- //如果服務(wù)器端代碼出現(xiàn)異常
- if (response.error != null)
- {
- //我們應(yīng)該能做得更好
- alert(response.error);
- return;
- }
- var states = response.value;
- //如果不是我們所希望的響應(yīng)
- if (states == null || typeof(states) != "object")
- {
- return;
- }
- //獲得州下拉列表
- var statesList = document.getElementById("states");
- statesList.options.length = 0; //重置州下拉列表
- //記住,其長(zhǎng)度不是 JavaScript 中的 Length
- for (var i = 0; i < states.length; ++i)
- {
- //如命名屬性一樣公開(kāi)行的列
- statesList.options[statesList.options.length] =
- new Option(states[i].State, states[i].Id);
- }
- }
經(jīng)過(guò)一些錯(cuò)誤檢查之后,前面的 JavaScript 獲得州下拉列表,遍歷響應(yīng)的值,并動(dòng)態(tài)地將選項(xiàng)添加到該下拉列表中。代碼清晰、簡(jiǎn)單并與 C# 和 Visual Basic .NET 非常相似。就我個(gè)人而言(作為基于服務(wù)器端變量創(chuàng)建了 JavaScript 數(shù)組并將它們鏈接在一起的開(kāi)發(fā)人員),我還要一段時(shí)間才能相信它真的起作用了。
有一個(gè)可能不太明顯的主要問(wèn)題。由于 DropDownList 是在 JavaScript 中動(dòng)態(tài)創(chuàng)建的,因此它的項(xiàng)不屬于 ViewState,并且不被維護(hù)。這意味著按鈕的 OnClick 事件處理程序需要進(jìn)行一些額外的修改。
- 'VB.NET
- Private Sub submit_Click(sender As Object, e As EventArgs)
- Dim selectedStateId As String = Request.Form(states.UniqueID)
- '應(yīng)進(jìn)行一些用戶(hù)驗(yàn)證...
- states.DataSource =
- DAL.GetCountryStates(Convert.ToInt32(countries.SelectedIndex))
- states.DataTextField = "State"
- states.DataValueField = "Id"
- states.DataBind()
- states.SelectedIndex =
- states.Items.IndexOf(states.Items.FindByValue(selectedStateId))
- End Sub
首先,我們不能使用 states.SelectedValue 屬性,而必須使用 Request.Form。其次,如果我們想向用戶(hù)重新顯示該列表,需要重新使用相同的數(shù)據(jù)訪問(wèn)方法綁定州 DropDownList。***,必須以編程方式設(shè)置選定的值。
以上就是ASP.NET AJAX示例:鏈接的下拉列表的實(shí)現(xiàn)。
【編輯推薦】