最近做一个网站,里面涉及到级联的问题(如省-市,品牌-型号等), 我用的是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>
<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>
<asp:UpdatePanel id="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:DropDownList ID="ddlCity" runat="server" Width="61px" Font-Size="14px" Height="23px">
</asp:DropDownList>
</ContentTemplate>
<asp:AsyncPostBackTrigger ControlID="ddlProvice" EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
</td>
{
int pid = int.Parse(((DropDownList)sender).SelectedValue);
if(pid==0)
{
ddlCity.Items.Insert(0, "<--城市-->");
ddlCity.Items[0].Value = "0";
}
else
{
BindCity(pid); //绑定函数
}
}