ASP.NET服务器控件

 

9. ASP.NET Ajax控件

 

Ajax英文全称Asynchronous JavaScript and XML(异步JavaScript和XML)是由数种技术

(JavaScript,CSS,HTML,XML,XSLT,DOM,XMLHttpRequest)组成的鸡尾酒式的技术。它是一种在服务器端与客户端异步通讯的技术,通俗来说就是无刷新的页面请求技术。在ASP.NET中无论是第一次对页面请求(!IsPostBack)还是其余的页面回发请求(IsPostBack)都会导致服务器端生成一个页面发送给客户端。而Ajax技术中主要是由XMLHttpRequest作为服务器端与客户端之间的代理层,它只从服务器端把客户端要求更新的信息提取出来,而不是把整个页面都提取过来。由于使用Ajax技术比较复杂,要掌握上面的很多技术,所以VS2008整合了一套Ajax开发框架,使编写Ajax程序非常轻松。Ajax框架主要由服务器端Ajax扩展(1.Ajax服务器控件(比如ScriptManager(不可或缺,像webpart控件的WebPartManager一样不可或缺且一个页面只能有一个,因此最好将其置于母板页的form标签下)和UpadatePanel(局部更新控件))2.Web Servers桥(默认情况下客户端JavaScript只能访问本域的web服务,Web桥将为外部的web服务创建一个代码,使JavaScript能够跨域访问web服务)3.应用程序服务桥(应用程序服务桥提供了让客户端的JavaScript脚本可以访问ASP.NET服务器控件的服务,如身份验证,用户个性化,本地化服务等))和客户端Ajax脚本库(包含了一系列的JavaScript脚本库)组成。

 

服务器端Ajax扩展

ScriptManager控件,将其拖入页面中然后运行该页,查看源码可以看到增加了很多<script>代码:

<script src="/ScriptResource.axd?d=LwkePuJXfkv-jzjWDuDtqD9mBSluMLjiogulHikRL-

1qFoVytwVlIlA4FlMDCuLHxZtbd4Aipjsm0GiXX7Uqh3RPlPrr-8nTW6G0Bs9lpgQ1&amp;t=633888638500000000" 

type="text/javascript"></script> 

<script type="text/javascript"> 

//<![CDATA[

if (typeof(Sys) === 'undefined') throw new Error('ASP.NET Ajax 客户端框架未能加载。');

//]]>

</script> 

<script src="/ScriptResource.axd?d=LwkePuJXfkv-jzjWDuDtqD9mBSluMLjiogulHikRL-

1qFoVytwVlIlA4FlMDCuLHpSYcdK_wAtXWk8D7hBKemFI3wC6oP7A-8-Hl58X-jDajXZMO-

plxgn3wPkRBLKZK0&amp;t=633888638500000000" type="text/javascript"></script> 

<script type="text/javascript"> 

//<![CDATA[

Sys.WebForms.PageRequestManager._initialize('ctl00$ScriptManager1', document.getElementById

('aspnetForm'));

Sys.WebForms.PageRequestManager.getInstance()._updateControls([], [], [], 90);

//]]>

</script> 

这些代码块的作用是向ScriptManager请求,让其分发Ajax所需要的客户端脚本(可以是位于程序集里的脚本,也可以是

服务器端的自定义脚本文件。通常是Microsoft Ajax.js和MicrosoftAjax WebForm.js(这俩文件嵌入在了

System.Web.Extensions.dll程序集里))。在代码块中可以看到ScriptResource.axd,它是一个HTTP处理器,它可以请求

位于程序集里的客户端脚本,看到有俩参数d(代表程序集里的资源识别符)和t(时间戳)。

 

让ScriptManager向客户端分发位于服务器端的自定义脚本(选中scriptmanager,切换到属性窗口,选择script属性,单

击右侧的按钮将弹出ScriptReference集合编辑器窗口,然后在path栏填入要分发的脚本文件的路径即可)在该编辑器和

ScriptManager属性中都有ScriptMode属性(可选值有Auto,Release,Debug,Inherrit(确定分发脚本的类型)),现在再运

行查看源码,可以看到已经分发了我们自定义的那个脚本文件。

 

在ScriptManager中注册web服务(首先先新建一个web服务,添加新项选web服务,然后在该服务文件写一个[WebMethod]级别的方法,建完一个web服务后,需要在ScriptManager中注册web服务,选中scriptmanager,切换到属性窗口,选择services属性,单击右侧的窗口将弹出ServicesReferences集合编辑器,在path栏填入刚才建立的web服务文件路径即可完成注册后,ASP.NET会生成一个javascript代理来供客户端的javascript脚本调用,最终通过该代理完成web服务里的[WebMethod]方法(web服务文件.asmx也能在浏览器中查看,并且在地址栏后面加上/js就会看到那个javascript代理)现在javascript脚本里就可以调用该web服务了):

本例是一个在客户端输入一个文本然后确定,在web服务文件的[WebMethod]方法里把该文本再加点东西,然后返回给客

户端(结果可以看出虽然请求了服务端但并没有引起回发)。web服务文件比较简单就不写了,我们重点来看客户端的

javascript代码:

                      <script type="text/javascript">

                        function getname()

                        {

       使用命名空间.web服务的类名.Web方法名。传递两个委托方函数进行失败或成功处理(一定要加命名空间)

       方法可加许多参数(根据情况,也可没有),但后俩参数分别是调用成功的函数和调用失败的函数最后一个是     

      自定义信息(失败的函数,自定义信息可没有)

           var name=document.getElementById("Text1").value;

           命名空间名.web服务的类名.GetName(name,success,failed,"自定信息");

                        }

                 //如果调用成功,则显示web服务的结果(第一个参数是web服务的返回值)

                       function success(result,usercontent) usercontent为用户自定义信息

                       {

                          alert(result+usercontent);

                       }

              //如果调用失败显示相应的调用失败的信息(这个就不说了,比较固定,参数为调用失败的返回值)

                       function failed(result)

                       {

       var message=String.format("statusCode={0}\r\nexceptionType={1}\r\ntimedOut={2}\r\nmessage={3}    \r\nstackTrace={4}",result.get_statusCode(),result.get_exceptionType(),result.get_timedOut        

 (),result.get_message(),result.get_stackTrace());

        alert(message);

                       }

                     </script>

如果用户想在页面加载完时就执行javascript的函数,该函数可写为function pageLoad(){}

总结:想要使用ASP.NET AJAX在客户端JavaScript中异步调用服务器端Web Service,我们需要:

为Web Service类或需要暴露给客户端的Web Service方法添加[ScriptService]属性;

为Web Service中需要暴露给客户端的方法添加[WebMethod]属性;

在页面中的ScriptManager控件中添加对该Web Service的引用;

在客户端使用如下JavaScript语法调用该Web Service:

[NameSpace].[ClassName].[MethodName](param1, param2 ......, callbackFunction)

为客户端异步调用指定回调函数,在回调函数中接收返回值并进一步处理。

 

其实页面里的方法也可以像web服务里的方法一样被客户端JavaScript中异步调用:

            首先是定义在ASP.NET页面中的类方法,完整的方法声明如下:

                [WebMethod] (要用[WebMethod]要引入System.Web.Services)

                public static string GetName(string name)

                {

                   return string.Format("Hello {0}!", name);

                }

然后是ScriptManager控件,注意粗体设置了EnablePageMethods属性为true,这也是让客户端能够直接调用服务器端页面方法所必需的。若你忘记了设定该属性,那么程序将无法完成预期功能:

             <asp:ScriptManager ID="sm" EnablePageMethods="true" runat="server" />

第三javascript程序中按钮的click事件处理函数以及异步调用的回调函数则需要一定的修改,如下所示:

                function getname()

                {

                   var name=document.getElementById("Text1").value;

                   PageMethods.GetName(name,success,failed);

                }

可以看到,调用页面方法代理时统一的前缀为PageMethods

总结:想要使用ASP.NET AJAX在客户端JavaScript中异步调用定义在ASP.NET页面中的方法,我们需要:

将该方法声明为公有(public);

将该方法声明为类方法(C#中的static,VB.NET中的Shared),而不是实例方法;

为该方法添加[WebMethod]属性;

将页面中ScriptManager控件的EnablePageMethods属性设置为true;

在客户端使用如下JavaScript语法调用该页面方法:

PageMethods.[MethodName](param1, param2 …, callbackFunction);

为客户端异步调用指定回调函数,在回调函数中接收返回值并进一步处理。

 

以上运用涉及到的数据类型只是简单的字符串类型,现在我们来使用复杂的数据类型(自定义类)来完成。

自定义的类:                  public class Person

                              {

                                  private int id;

                                  public int Id

                                  {

                                    get { return id; }

                                    set { id = value; }

                                  }

                                  private string name;

                                  public string Name

                                  {

                                    get { return name; }

                                    set { name = value; }

                                  }

                                  private string age;

                        [System.Web.Script.Serialization.ScriptIgnore] 该属性级别是在生成的客户端       

                        JavaScript对象后不能取得该公有属性的值(我们可以把不想显示的属性设为该级别)

                                  public string Age

                                  {

                                    get { return age; }

                                    set { age = value; }

                                  }

                                  public Person()

                                  { 

                                  }

                                  public Person(int i1,string s,int i2 )

                                  {

                                   id = i1; name = s; age = i2;

                                  }

                                }

这里的属性是和相应字段绑定在一起了,如果给字段赋值,再获取相应的属性值,得到的就是那个字段的值,,给属性赋值,再获取相应的字段值,得到的就是那个属性的值,这通过属性的get与set代码很容易看出来。记得在写webpart个性化属性时,那时属性是与某个控件的属性绑定在一起的,如下:

                         public string textvalue

                         {

                             get { return TextBox1.Text; }

                             set { TextBox1.Text = value; }

                          } 

 

该类型一定要提供一个无参数的构造函数,且该类所有的公有属性都应该提供getter和setter访问器,在ASP.NET异步通

讯层将这个该服务器端类型生成相应的客户端JavaScript类型时只保留公有的字段和属性,该类的私有字段和方法都不

会被添加到相应的客户端JavaScript类(默认是被序列化为jason字符串)中。

若想传递某些复杂的数据类型(不包括日期型枚举类型等这些类型跟简单类型的处理一样),比如某个自定义类型或结构

,那么我们要显式告知ASP.NET AJAX异步通讯层为该服务器端类型生成相应的客户端JavaScript类型(默认是被序列化

为jason字符串),所以这时的web服务里的类要这样写:

                        [GenerateScriptType(typeof(Person))] (要引入System.Web.Script.Services)

                        [System.Web.Script.Services.ScriptService]

                        public class Ajaxwebservice : System.Web.Services.WebService

                         {              

                             [WebMethod]

                             public Person sendperson()

                             {

                               return new Person(1, "王阳", 30);  通过构造函数给字段赋值,所以相应的公有属性也得到该值

                             }

                         }

[GenerateScriptType(typeof(Person))]告知ASP.NET AJAX异步通讯层为该服务器端类型生成相应的客户端

JavaScript类型,假如Person类里面还有一个嵌套类,那么也应把那嵌套类如法炮制。然后注册完web服务,就可以在客

户端程序中调用[WebMethod]方法再处理自定义类了(当然也可以由客户端返回一个Person类在服务器端处理,只是我们要先在web服务里写一个能发送Person类的方法,然后构造函数的参数可以随便写:如

                             [WebMethod]

                             var Cliperson=null;  定义一个将来要被赋值为客户端Person对象的变量

                             public Person Tsperson()

                             {

                               return new Person(1, "1", 1);  通过构造函数给字段赋值,所以相应的公有属性也得到该值

                             }

                    javascript代码:先在pageLoad()里得到经转换过来的Person对象:

                             function pageLoad()

                           {

                              命名空间名.Ajaxwebservice.Tsperson(onsuccess)

                           }

                             function onsuccess(result)

                            {

                              这时我们得到的result就是经转换过来的Person对象(原Person对象里的公有属性都在其里面)

                             Cliperson=result; 得到客户端Person对象赋值给Cliperson变量,这样我们以后修改客户端                                       Person对象就不用非等web服务给我们发该对象了,直接通过Cliperson修改即可

                            }

                            function Chanperson()

                            {

                              通过Cliperson修改客户端Person对象

                              Cliperson.Id=1;Cliperson.Name="刘波";Cliperson.Age=30;

                              web服务处理对象(客户端传过来的已被转换为服务端Person类)的函数

                              命名空间名.Ajaxwebservice.Dealperson(Cliperson,oonnsuccess)

                            }

 

)

javascript代码:  

                        function pageLoad()

                        {

                          命名空间名.Ajaxwebservice.sendperson(successed)

                        }

                        function successed(result)

                        {

                          document.getElementById("Text1").value=result.Id+result.Name+result.Age;

                        }  

前面已经说过,生成相应的客户端JavaScript类型时只保留公有的字段和属性,所以本处生成的客户端javascript对像

result(默认是jason对象)是通过原类型的公有属性获得信息的。(有时javascript客户端代码会出现在命名空间下找

不到定义好的类和方法重新生成后需要等一下,本处Id,Name,Age没有智能提示,是硬写进去的)。  

 

总结:想要让ASP.NET AJAX异步通讯层为服务器端复杂类型自动生成相应的客户端JavaScript类型,并在调用过程中

传递并接收该复杂类型,我们需要:

为Web Service类或Web Service中需要暴露给客户端的方法添加[ScriptService]属性;

为Web Service中需要暴露给客户端的方法添加[WebMethod]属性;

Web Service类中的某个方法的某个参数或返回值为该复杂类型;

为Web Service类添加若干个[GenerateScriptType(typeof([TypeName]))]属性,[TypeName]表示该复杂类型或其嵌套的复杂类型的名称;

该复杂类型必须要有一个无参数的构造函数;

该复杂类型的所有公有属性应该提供getter和setter访问器(即需要可读可写),除非如下几种情况:

该属性应用了[System.Web.Script.Serialization.ScriptIgnore]属性,即让ASP.NET AJAX异步通讯层在生成客户端

JavaScript类型时忽略该属性,那么其属性可以没有setter或getter。

该服务器端对象只是用来单向输出JSON字符串,那么其属性可以没有setter。

在客户端传入的时候不会设置该属性的值,那么该属性可以没有setter。

在页面中的ScriptManager控件中添加对该Web Service的引用。

然后,ASP.NET AJAX异步通讯层在为某服务器端复杂类型生成客户端JavaScript类型时,将:

会把没有应用[System.Web.Script.Serialization.ScriptIgnore]的公有属性(property)或公有字段(field)映射

到客户端JavaScript类型中;

不会把该复杂类型的私有字段映射到客户端JavaScript类型中;

不会把该复杂类型的方法(method)映射到客户端JavaScript类型中;

 

 

现在来学习涉及到数组的应用(简单类型的数组可以直接转化):

web服务:                      [WebMethod]

                                    public string[] sendsz()

                                     {

                                      return new string[] { "小明", "小红", "小兰" };

                                     }

                                    [WebMethod]

                                    public string getsz(string[] sz)

                                     {

                                       return sz[1];

                                     }

 

javascript代码:                    function pageLoad()

                                     {

                                       命名空间名.Ajaxwebservice.sendsz(onsuccess1);

                 var stringArray=["辟邪剑谱","葵花宝典","武穆遗书"];  注意javascript数组的写法

                                       命名空间名.Ajaxwebservice.sendsz(stringArray,onsuccess2);

                                     }

                                   function onsuccess1(result)

                                     {

                                       for(var i=0;i<result.length;i++)

                                        {

                                          document.getElementById("Text1").value+=result[i];

                                        }

                                     }

                                    function onsuccess2(result)

                                     {

                                       alert(result);

                                     }

http://www.cnblogs.com/Terrylee/archive/2006/10/27/aspnet_ajax_scriptmanagerproxy.html里作者是想在自定义的js脚本里调用不同的webservice服务,他那种方法固然可以,但其实我们在scriptmanager控件里注册webservice服务时可以注册多个webservice服务,因为scriptmanager的services属性是一个集合属性,没有必要再添加一个scriptmanagerproxy控件。另外,我们对服务器端控件使用js函数对其操作时,我们要最好先用开发人员工具在客户端先看看其生成的客户端代码是怎样的,然后再根据其客户端代码有什么属性什么id等来操作,因为js脚本操作的就是客户端代码。

 

编程控制ScriptManager控件

 

有时也需要通过编程的方式进行控制,ScriptManager提供了很多的属性和方法可供开发人员进行调用:

EnablePartialRendering(该属性表示是否进行局部更新(Ajax效果))

AllowCustomErrorsRedirect(该属性表示当Ajax产生错误时是否根据web.config里的<CustomError>节点的设置重定位到错误界面)

EnableScriptGlobalization(该属性使客户端脚本可以在浏览器中显示区域性特定的日期和时间)

ScriptManager sm=ScriptManager.GetCurrent(this); (ScriptManager的静态方法GetCurrent可以获得页面上的

ScriptManager对象)

sm.RegisterAsyncPostBackControl(); (RegisterAsyncPostBackControl方法接受一个Control类型的对象(就是所有控件的对象),然后该控件对象就被注册为支持异步回送的触发器(默认只有Updatepanel里的控件才支持异步回送,但当位

于Updatepanel外部的控件对象被注册为支持异步回送的触发器就也支持异步回送,无刷新更新Updatepanel里的数据了,

如果Updatepanel里的控件值发生改变的话,参数为控件的ID并且不加引号)

补:

前面也分析了无论第一次请求页面(!IsPostBack)(包括输入网址后转到和刷新)还是控件引发的回发(IsPostBack)都会导致服务器重新加载一个页面发到客户端(但这俩不同之处是请求页面是发回一个"干净的页面",没有任何数据在里面,而回发是将页面里控件的数据值发送到服务器(这些值保存在viewstate里或控件自己的控件状态里),服务器处理这些数据(不是全处理,只按控件ID从viewstate或控件状态里得到并处理在后置代码里涉及到的控件的数据(如后置代码里涉及到了控件TextBox1和TextBox2:string a=TextBox1.Text;TextBox2.Text="2";)(看前面有关的页面生命周期的文章会知道页面回发后会在页面生命周期中加入引起页面回发的控件的事件))后(无关的数据(没有涉及到的其他控件的值)还在)再把处理了的页面(包含viewstate和控件状态)发到客户端,客户端再按控件ID将viewstate和控件状态里的数据分发给各控件)不过有些浏览器是有缓存的,有时!IsPostBack由于网址没变,页面不会被发到服务器,服务器也没有处理页面数据再发回新页面,而是直接从浏览器缓存里发来一个老的页面,而这个页面的数据还是老数据)。

还记得我们前面通过ScriptManager的scripts属性和services属性给ScriptManager添加javascript脚本和web服务了吗?这也可以通过编程的方式添加:

sm.Services.Add(new ServiceReference("~/Servertime.asmx"));

sm.Script.Add(new ScriptReference("~/Script/Script1.js"));

 

 

UpdatePanel的使用

UpdatePanel主要功能是为其内部的控件提供无刷新的局部更新功能。默认情况下,只要回发并且更新了UpdatePanel内的内容,无论引起回发的控件位于UpdatePanel内部还是外部,都会引起UpdatePanel内的内容的变化,不同的是位于UpdatePanel内部的控件是无刷新变化,位于UpdatePanel外部的控件是刷新变化,最主要的不同是位于UpdatePanel外部的控件是引起整个页面回发所以不光更新UpdatePanel内的内容,还会更新UpdatePanel外的内容,而位于UpdatePanel内部的控件只会更新UpdatePanel内的内容。还记得ScriptManager注册的异步触发器的控件吧?注册为异步触发器后无论该控件位于UpdatePanel内部还是外部,都只能无刷新更新UpdatePanel内的内容。

如果有多个UpdatePanel并且有的UpdatePanel里的控件异步回发还会更新别的UpdatePanel里的内容,这是UpdatePanel默认的UpdateMode属性为Always的原因,如果将其设为Conditional则只更新自己里面的内容,即使有更新别的UpdatePanel里内容的代码也不会更新那个UpdatePanel里的内容(此时ScriptManager注册的异步触发器也只能更新UpdateMode属性为Always的UpdatePanel里的内容)UpdateMode属性设置为Conditional后有三种方法来控制更新(1.UpdatePanel的Update方法,假如UpdatePanel1的UpdateMode属性为Conditional,而我们想通过UpdatePanel2里控件的回发来更新UpdatePanel1的内容,我们可以在UpdatePanel2里控件的回发事件里先写改变UpdatePanel1的内容的代码再写UpdatePanel1.Update()这样的效果与UpdatePanel1的UpdateMode属性为Always一样。2.UpdatePanel的Triggers属性(也是一种触发器,也是不管是位于UpdatePanel内部还是外部,但这个触发器的更新与UpdateMode属性无关,无论UpdateMode属性设成什么,都能更新),还是用上面的例子,我们可以将UpdatePanel2里的回发控件添加到UpdatePanel1的Triggers集合里(在编辑器里有两种触发器一种是AsyncPostBackTrigger(异步触发器)一种是PostBackTrigger(整页回发,没有异步更新效果),写了控件ID之后还要写该控件的哪个事件引起更新)。3.如果把UpdatePanel2的UpdateMode属性设为Conditional,把UpdatePanel1的Triggers属性设为UpdatePanel2里的回发控件,这样UpdatePanel2里的回发控件回发会同时更新这俩UpdatePanel,这时如果把UpdatePanel2的ChildrensAsTrrigers属性设为false,效果是UpdatePanel2里的回发控件回发只更新UpdatePanel(注意UpdatePanel2的UpdateMode属性必须设为Conditional,否则会出错))。

默认UpdatePanel的客户端代码显示为div,通过其RendMode属性可以设置为span。

编程控制UpdatePanel控件

有时可能需要以编程的方式来控制UpdatePanel,比如为其动态添加或移除控件,添加新的触发器或移除已有的触发器以及动态设置属性等,下面演示如何为其动态添加控件:

                         protected void Page_Load(object sender, EventArgs e)

                         {

                           UpdatePanel up = new UpdatePanel();

                           up.ID = " UpdatePanel1";

                           Button bt = new Button();

                           bt.ID = "Button1";

                           bt.Text = "按钮";

                           bt.Click+=new EventHandler(bt_Click);

                           LiteralControl br = new LiteralControl("<br>");

                           Label lb = new Label();

                           lb.ID = "Label1";

                           lb.Text = "[time]";

                           up.ContentTemplateContainer.Controls.Add(bt);

                           up.ContentTemplateContainer.Controls.Add(br);

                           up.ContentTemplateContainer.Controls.Add(lb);

                           this.Form.Controls.Add(up);

                          }

使用UpdateProgress控件

ASP.NET Ajax提供了UpdateProgress控件,可以让用户了解当前页面的异步回送状态,这在网速不理想的情况下很有必要。UpdateProgress在客户端是一个div(既可在UpdatePanel内也可在UpdatePanel外)将通过检测UpdatePanel的异步回送状态来显示或隐藏进度条(UpdateProgress有一个AssociateUpdatePanel的属性,用来指定其关联到的UpdatePanel的ID,否则将显示任何异步回发的进度。还有一个DisplayAfter属性用来指定其过多久显示,默认是500毫秒)

      <asp:UpdateProgress ID="UpdateProgress1" runat="server" AssociatedUpdatePanelID="UpdatePanel1">

         <ProgressTemplate>

            <asp:Image ID="Image1" runat="server" ImageUrl="~/images/xxx.gif"/>

             正在获取服务器端数据...

         </ProgressTemplate>

      </asp:UpdateProgress>

以上代码为其增加了一个图片(http://www.ajaxload.info里有非常多的进度条动画图片)

         protected void Button1_Click(object sender, EventArgs e)

        {

            System.Threading.Thread.Sleep(3000);

            Label1.Text = DateTime.Now.ToString();

        }

为了使效果明显,我们通过System.Threading.Thread.Sleep(3000)这条语句使服务端执行时间延长3秒。

 

取消异步回送

有时由于网络问题可能一个异步回送会很久,这时我们可以为客户在UpdateProgress的ProgressTemplate放一个客户端取消异步回送的按钮。这个效果需要编写javascript脚本:

          <input id="Button1" type="button" value="取消" οnclick="CancelAsyncPostBack()"/>

                   <script type="text/javascript">

                     //先获取PageRequestManager客户端类的实例

                     var prm=Sys.WebForms.PageRequestManager.getInstance();

                    function CancelAsyncPostBack()

                     {  //判断客户端生命周期中是否处理异步回发状态

                        if(prm.get_isInAsyncPostBack())

                         { //中断回发

                          prm.abortPostBack();

                         }

                     }

                  </script>

 

使用Timer控件更新UpdatePanel

ASP.NET Ajax提供了一个定时器控件Timer,比如一些需要实时更新的数据,可以使用Timer控件定期地更新UpdatePanel来更新数据。Timer有一个事件叫Tick,当时间间隔达到Timer的Interval属性设置的时间间隔(默认死60000毫秒)时就会触发该事件,该事件里可以写更新UpdatePanel的代码,从而有无刷新的效果。Timer可以位于UpdatePanel内部,达到指定Interval值时会自动触发异步回发,Timer会将一个JavaScript组件嵌入到网页中。经过Interval属性定义的时间间隔时,该JavaScript组建将从浏览器回发。可以在运行于服务器上的代码中设置Timer控件的属性,这些属性将传递到该JavaScript组件。也可以将Timer放于UpdatePanel外部,但要将UpdatePanel的Triggers属性把Timer控件设置为异步触发器。由于web程序是一个长途的运用,所以还是不要频繁使用Timer,不然会影响服务器性能及页面响应。

 

updatepanel回调时会回调所有的数据,这些数据到达服务器端后会经历一个完整的ASP.NET页面生命周期,与回发不同之处就是只无刷新的更新updatepanel内部的控件。

所以使用updatepanel只是表面上实现了Ajax回调效果,但效率上不能替代Ajax回调。

http://developer.51cto.com/art/200907/140180.htm

http://hi.baidu.com/ustc10/blog/item/3795b61037c7c6fbc3ce799f.html


 

ASP.NET Ajax服务器端控件扩展

VS2008要使用这些空控件需要安装ASP.NET AJAX Control Toolkit(http://www.codeplex.com/AtlasControlToolkit/

Release/ProjectReleases.aspx?ReleaseID=11121)该网站中有AjaxControlToolkit-Framework3.5.zip这个为ASP.NET3.5和VS2008准备的压缩包。解压后会有6个文件和一个AjaxControlToolkit.sln,打开该解决方案会看到4个项目

AjaxControlToolkit(包含Control Toolkit中所有控件的源代码)SampleWebSite(包含每个控件的使用方法的示例网站,这对学习这些控件非常有用)ToolkitTests(包含所有控件的自动化测试代码)TemplateVSI(允许创建新的Ajax控件)

 

要使用这些控件,在工具箱里右键选"选择项"添加SampleWebSite里bin里的AjaxControlToolkit.dll程序集。我们主要添加了Accordion和AccordionPane这俩.NET组件,接下来我们会在AJAX Extensions或常规选项卡里看见那些丰富的Ajax控件了。在这些Ajax控件中有一些被称为扩展器控件,它们能扩展现有标准控件的功能(当把标准控件(那些Ajax扩展控件也可以)拖到页面后智能任务栏会出现扩展控件的选项,在里面可以选那些扩展器控件扩展现有标准控件的功能,当然也可以删除这些扩展器控件,选择不同的扩展器控件后,vs2008会为标准控件生成代码框架或在智能任务栏列出与该扩展器控件相关的进一步信息)。Ajax扩展控件的前缀是cc1,我们可以在web.config中改成:

             <system.web>

               <pages>

                 <controls>

                  <add tagPrefix="Ajax" namespace="AjaxControlToolkit" assembly="AjaxControlToolkit"/>

                 </controls>

               </pages>

             </system.web>

这样它们的前缀就变成Ajax了,在选择项的时候会看到它们的namespace及assembly(程序集)

可以同时打开俩VS对着微软的例子照着做,通过对比微软的运行网页及自己改属性前后的运行网页搞清楚控件的每个属性和事件是什么意思,同时学习微软的样式设计。

 

http://www.cnblogs.com/frank_xl/archive/2010/02/06/1665130.html(web服务)

http://www.cnblogs.com/xiaoyin_net/archive/2009/03/08/1406215.html

http://www.cnblogs.com/xiaoyin_net/archive/2009/03/08/1406215.html

http://www.cnblogs.com/dflying/archive/2007/06/05/771471.html(上下篇基本把Ajax异步web服务讲全了)

http://www.cnblogs.com/dflying/archive/2007/06/05/771490.html

(AJAX环境中从客户端JavaScript调用Web服务方法)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值