最近做一個網站,裡面涉及到級聯的問題(如省-市,品牌-型号等), 我用的是DropDownList來實作的,設定父級的AutoPostBack屬性為真.然後在它的SelectedIndexChanged()事件裡寫相應的代碼,這樣就能實作級聯關系(當然這裡要注意IsPostBack的問題). 做好之後用時發現一個非常不爽的問題,那就是每次都會重新整理,這樣的體驗自已都感覺非常不爽(更不敢交給客戶).是以就上網找一些關于無重新整理級聯的東東,東東真不少,有javascript ,ajrx, updatepanel等,關于這些差別可能上網查。
由于是第一次用這些東東,而且項目周期所限,就後選擇最簡單的updatepanel.雖然很簡單,但在這個過程中也有一些問題,特别對于像我這樣完全沒有接觸過ajax的菜鳥了(剛開始連updatepanel在哪,怎麼添加都不知道?)。呵呵費話已說了很多了,接下來我來說說我的整個過程.
1、安裝Ajax元件(這樣最簡單友善)。在百度輸入(ASP.NET AJAX 1.0 下載下傳)即可找到需要下載下傳的軟體。
安裝後将X:/Program Files/Microsoft ASP.NET/ASP.NET 2.0 Ajax Extensions/v1.0.61025
目錄下的System.Web.Extensions.Design.dll檔案加到項目的bin目錄下,檔案複制到網站bin目錄
安裝了asp.net Ajax後會有三個dll檔案
System.Web.Extensions.Design.dll
AjaxExtensionsToolbox.dll
System.Web.Extensions.dll
一般應該将這三個檔案都添加到項目的bin目錄下,要保險的話,全部複制進去吧
2、添加引用。在解決方案視圖視窗中,右擊網站名稱--添加引用--浏覽。找到工程的bin目錄選擇System.Web.Extensions.Design.dll和System.Web.Extensions.dll.然後确定,完成引用的添加.
3、把updatepanel添加到工具欄中. 右擊工具欄空白處--選擇項--浏覽:找到工程bin目錄并選擇System.Web.Extensions.dll. 然後在上面的選擇剛添加的工具(選擇時要厘清版本,不在選擇3.5(假如你安裝了。net3.5)),完成後在工具欄的标準中的最下方添加了兩個控件ScriptManager和UpdatePanel
到這一步就可以和使用控件沒有什麼差別了,但是我的項目中的無重新整理級聯沒有效果--即安裝好updatepanel後會出現不好用,導緻随時都是整個頁面的重新整理.
上網找對了一些資料懂了一點點,知道由于我建立的不是Ajax的項目,是以無效,但可以改配置檔案。如果沒有改配置檔案可以出錯像("System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35”或它的某一個依賴項。系統找不到指定的檔案。)這樣的錯誤.
接下來讓我們來看一下webconfig的修改吧!
1、<assemblies></assemblies>之間加入 :<add assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> (如果沒有這一句就加入)
2、在檔案的<system.web></system.web>配置節中加一段代碼
我這裡講述的是updatepanel的使用及配置,對于它的原理網上很大大家可以上網,(其實我也沒懂,因為我是個菜鳥). 對于updatepanel的屬性等的設定有不明白的也可以上網查,但是要設定和要注意的地方我一般有紅色标明了!
希望高手們指點,和我一樣的菜鳥多交流!
<httpHandlers>
<remove verb="*" path="*.asmx"/>
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
</httpHandlers>
<httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</httpModules>
到這裡就可以正确的使用updatepanel控件了,且出現了我要的效果,呵呵,(對于我來說)不容易啊!小小樂一下!
接下我發個小例子讓大家參考一下(說好聽的,主要還是防止以後忘了,可以來看一眼)
(注意: aspx頁面加入 注冊:
<%@ Register Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"Namespace="System.Web.UI" TagPrefix="asp" %>
)--其實拖完控件它自動注冊了!
//在updatepanel使用之前一定要先加這個控件,且它的EnablePartialReadering = True
<asp:ScriptManager id="ScriptManager1" runat="server">
</asp:ScriptManager> <table style="background-image: url(../images/search.jpg); width: 950px; background-repeat: no-repeat; height: 58px">
<tr valign="bottom">
<td valign="middle" style="height: 27px" >
<asp:TextBox ID="txtSearch" runat="server" Width="174px"></asp:TextBox></td>
<td valign="middle" style="height: 27px" > //省份下拉清單
<asp:DropDownList ID="ddlProvice" runat="server" Width="53px" OnSelectedIndexChanged="ddlProvice_SelectedIndexChanged" Font-Size="14px" Height="23px" AutoPostBack="True">
</asp:DropDownList> //把要重新整理的控件包含在updatepanel裡面,盡量的少,這些就可以減少網絡的傳輸 UpdateMode 屬性設: Conditional
<asp:UpdatePanel id="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:DropDownList ID="ddlCity" runat="server" Width="61px" Font-Size="14px" Height="23px">
</asp:DropDownList>
</ContentTemplate>
//觸發器 <Triggers>
<asp:AsyncPostBackTrigger ControlID="ddlProvice" EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
</td> </tr> </table> 背景代碼: //省份的相應事件 protected void ddlProvice_SelectedIndexChanged(object sender, EventArgs e)
{
int pid = int.Parse(((DropDownList)sender).SelectedValue);
if(pid==0)
{
ddlCity.Items.Insert(0, "<--城市-->");
ddlCity.Items[0].Value = "0";
}
else
{
BindCity(pid); //綁定函數
}
}