职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 3405|回复: 13

ASP.NET AJAX入门教程总汇

[复制链接]
无处不在 发表于 2010-5-13 10:40 | 显示全部楼层 |阅读模式
本帖最后由 无处不在 于 2010-5-13 10:41 编辑

ASP.NET AJAX入门系列(1):概述

一.ASP.NET AJAX组成部分

在ASP.NET AJAX官方网站上有如下三个下载:
1.ASP.NET AJAX:这部分是ASP.NET AJAX的核心部分,包括了核心AJAX类型系统,网络协议层(networking stack),组件模型,扩展器(extender)基类,以及与ASP.NET集成的服务器端功能(包括广受欢迎的ScriptManager,UpdatePanel,和 Timer控件)。功能列表如下:

服务端功能列表

Asynchronous client-to-server networking

Authentication as a Web service

ControlExtender class

Profile as a Web service

ScriptManager and ScriptManagerProxy controls

Static page methods as Web services

Timer control

UpdatePanel control

UpdateProgress control

客户端功能列表

Authentication for JavaScript

Behavior class

Calling .asmx Web services from JavaScript

Component class

Control class

Debug class

JavaScript Array type extensions

JavaScript Boolean type extensions

JavaScript Error type extensions

JavaScript Number type extensions

JavaScript Object type extensions

JavaScript String type extensions

JSON serialization

Profile for JavaScript

Trace class



2.ASP.NET AJAX “Value-Add”CTP:ASP.NET AJAX社区支持的“增值”CTP部分,包括了以前各个Atlas CTP版本包含的,但并不在完全支持的“核心”1.0 版本内的额外的高级特性。通过进一步的反馈,这些将会逐步稳定的增加到核心1.0中去。功能列表如下:

服务端功能列表

AutoCompleteExtender class

Cross-browser Web Parts drag-and-drop

DragOverlayExtender control

PopupExtender class

客户端功能列表

Actions components

AutoCompleteBehavior class

BatchResponse class

Binding component

Button control

Checkbox control

Click behavior

Counter class

Cross-browser Web Parts

Data control

DragDropList control

DragDropManager component

DraggableListItem control

FadeAnimation component
Floating behavior

Hover behavior

Hyperlink control

Image control

Input control

Label control

Layout behavior

Opacity behavior

Popup behavior

Selector control

ServiceMethodRequest class

Sys.Data and Sys.UI.Data namespaces

Textbox control

Timer control

Validator controls

xml-script support



3.ASP.NET AJAX Control Toolkit:包含了基于ASP.NET AJAX 1.0 版“核心”下载版本的28个非常酷的免费AJAX控件。它是一个开源项目,由微软和非微软开发人员共同开发的,去CodePlex下载代码。

二.安装ASP.NET AJAX
1.在安装ASP.NET AJAX 1.0 Beta之前,需要先卸载以前所有的CTP版本。
2.下载ASP.NET AJAX 1.0 Beta安装包,安装时Microsoft.Web.Extensions.dll程序集将被安装在GAC(Global Assembly Cache)中,所以使用时不需要再在Web站点的Bin文件夹中包括该程序集。
3.下载安装ASP.NET AJAX “Value-Add”CTP和ASP.NET AJAX Control Toolkit。列表如下:

名称
描述

Accordion:
Create efficient UI from multiple panes with this animated control.

AlwaysVisibleControl
Docks a panel to a corner of the browser window and keeps it visible even when the user scrolls.

Animation
Adds powerful, easy to use animations to any element or control.

CascadingDropDown
Easily link drop downs, complete with asynchronous population and no postbacks!

CollapsiblePanel
This extender allows panels on your page to collapse and expand with no code.

ConfirmButton
This extender adds a confirm dialog to any Button, LinkButton, or ImageButton control.

DragPanel
Makes any panel into an object that you can drag around the page.

DropDown
This extender can wrap any control to provide a SharePoint-style drop-down menu that is attached to the control.

DropShadow
This extender adds attractive drop shadows to any control on the page

DynamicPopulate
Replace the contents of a page element with the result of a web-service call.

FilteredTextBox
Restrict the types of input that text boxes will accept.

HoverMenu
Allows UI to pop up next to a control when the mouse hovers over it.

ModalPopup
Allows you to show styled modal UI without using HTML dialogs.

MutuallyExlcusiveCheckBox
By adding a number of checkboxes to the same “Key”, only one checkbox with the specified key can be checked at a time.

NoBot
Applies simple rules to prevent automated bots or scripts from posting to a page.

NumericUpDown
Allow users to easily increase and decrease values using the mouse to scroll through values.

PagingBulletedList
Add paging and sorting to long bulleted lists.

PasswordStrength
Give your users visual cues to help them create secure passwords.

PopupControl
This extender turns any panel into a popup.

Rating
Let your users easily give feedback by rating content with this easy-to-use control.

ReorderList
This control is a full-featured data-bound control that allows its elements to be reordered on the client via drag and drop.

ResizableControl
Allow users to dynamically resize content, right in the browser

RoundedCorners
Rounds the corners of any control for a clean, professional look!

Slider
Adds an elegant scrollbar-like user interface for setting numeric values.

TextBoxWatermark
This extender adds "watermark" prompt text to TextBoxes on the page.

ToggleButton
This extender turns an ASP.NET CheckBox into an image checkbox.

UpdatePanelAnimation
Animates page elements corresponding to hidden postback activity.

ValidatorCallout
This extender enhances the functionality of existing ASP.NET validators.

ASPNETAJAX_001.gif


三.在Visual Studio.NET 2005开发基于ASP.NET AJAX的应用
安装完ASP.NET AJAX后,打开Visual Studio.NET 2005中新建Web Site,在项目模板中会出现一项ASP.NET AJAX-enabled Web site,直接选择它就可以了,如下图:

新建完成的项目中会自动在Web.config中做好相关的配置,并且AJAXExtensionToolbox.dll已经添加到了VS的工具箱中,不需要再手工添加。

概述篇简单的介绍这里,从下一篇开始学习ASP.NET AJAX中的每一项具体的功能。
 楼主| 无处不在 发表于 2010-5-13 10:48 | 显示全部楼层
ASP.NET AJAX入门系列(2):使用ScriptManager控件
ScriptManager控件包括在ASP.NET 2.0 AJAX Extensions中,它用来处理页面上的所有组件以及页面局部更新,生成相关的客户端代理脚本以便能够在JavaScript中访问Web Service,所有需要支持ASP.NET AJAX的ASP.NET页面上有且只能有一个ScriptManager控件。在ScriptManager控件中我们可以指定需要的脚本库,或者指定通过JS来调用的Web Service,以及调用AuthenticationService和ProfileService,还有页面错误处理等。

主要内容
1.控件概述
2.一个简单的示例
3.客户端脚本模式
4.错误处理
5.Services属性
6.Scripts属性

一.控件概述
ScriptManager控件包括在ASP.NET 2.0 AJAX Extensions中,它用来处理页面上的所有组件以及页面局部更新,生成相关的客户端代理脚本以便能够在JavaScript中访问Web Service,所有需要支持ASP.NET AJAX的ASP.NET页面上有且只能有一个ScriptManager控件。在ScriptManager控件中我们可以指定需要的脚本库,或者指定通过JS来调用的Web Service,还可以指定页面错误处理等。
使用<asp:ScriptManager/>来定义一个ScriptManager,简单的ScriptManager定义形式:
  1. <asp:ScriptManager ID="ScriptManager1"

  2.                    runat="server">

  3.       <AuthenticationService Path="" />

  4.       <ProfileService LoadProperties="" Path="" />

  5.       <Scripts>

  6.         <asp:ScriptReference/>

  7.       </Scripts>

  8.       <Services>

  9.         <asp:ServiceReference />

  10.       </Services>

  11. </asp:ScriptManager>
复制代码
ScriptManager属性和方法如下:



属性/方法
描述

AllowCustomError
和Web.config中的自定义错误配置区<customErrors>相联系,是否使用它,默认值为true

AsyncPostBackErrorMessage
异步回传发生错误时的自定义提示错误信息,

AsyncPostBackTimeout
异步回传时超时限制,默认值为90,单位为秒

EnablePartialRendering
是否支持页面的局部更新,默认值为True,一般不需要修改

ScriptMode
指定ScriptManager发送到客户端的脚本的模式,有四种模式:Auto,Inherit,Debug,Release,默认值为Auto,后面会仔细说到。

ScriptPath
设置所有的脚本块的根目录,作为全局属性,包括自定义的脚本块或者引用第三方的脚本块。如果在Scripts中的<asp:ScriptReference/>标签中设置了Path属性,它将覆盖该属性。

OnAsyncPostBackError
异步回传发生异常时的服务端处理函数,在这里可以捕获一场信息并作相应的处理。

OnResolveScriptReference
指定ResolveScriptReference事件的服务器端处理函数,在该函数中可以修改某一条脚本的相关信息如路径、版本等。



二.一个简单的示例
这个例子其实是UpdatePanel示例,在页面中加入了日期控件和一个下拉框,根据下拉框选择的不同,日期控件背景变为不同的颜色。示例代码如下:
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>



  2. <script runat="server">

  3.     void DropDownSelection_Change(Object sender, EventArgs e)

  4.     {

  5.         Calendar1.DayStyle.BackColor =

  6.             System.Drawing.Color.FromName(ColorList.SelectedItem.Value);

  7.     }

  8. </script>



  9. <html xmlns="http://www.w3.org/1999/xhtml">

  10. <head id="Head1" runat="server">

  11.     <title>ScriptManager Example</title>

  12. </head>

  13. <body>

  14.     <form id="form1" runat="server">

  15.         <div>

  16.             <asp:ScriptManager ID="ScriptManager1"

  17.                                runat="server">

  18.             </asp:ScriptManager>

  19.             <asp:UpdatePanel ID="UpdatePanel1"

  20.                              runat="server">

  21.                 <ContentTemplate>

  22.                     <asp:Calendar ID="Calendar1"

  23.                                   ShowTitle="True"

  24.                                   runat="server" />

  25.                     <div>

  26.                         Background:

  27.                         <br />

  28.                         <asp:DropDownList ID="ColorList"

  29.                                           AutoPostBack="True"

  30.                                           OnSelectedIndexChanged="DropDownSelection_Change"

  31.                                           runat="server">

  32.                             <asp:ListItem Selected="True" Value="White">

  33.                             White </asp:ListItem>

  34.                             <asp:ListItem Value="Silver">

  35.                             Silver </asp:ListItem>

  36.                             <asp:ListItem Value="DarkGray">

  37.                             Dark Gray </asp:ListItem>

  38.                             <asp:ListItem Value="Khaki">

  39.                             Khaki </asp:ListItem>

  40.                             <asp:ListItem Value="DarkKhaki"> D

  41.                             ark Khaki </asp:ListItem>

  42.                         </asp:DropDownList>

  43.                     </div>

  44.                 </ContentTemplate>

  45.             </asp:UpdatePanel>

  46.             <br />

  47.         </div>

  48.     </form>

  49. </body>

  50. </html>
复制代码
三.客户端脚本模式
在前面我们提到了ScriptMode属性指定ScriptManager发送到客户端的脚本的模式,它有四种模式:Auto,Inherit,Debug,Release,默认值为Auto。
1.Auto:它会根据Web站点的Web.config配置文件来决定使用哪一种模式,只有当配置文件中retail属性设置为false:.Inherit:应该是通过程序设置ScriptMode的时候,等同于Auto?(不太了解)

<system.web>

  <deployment retail="false" />

</system.web>或者页面中的Debug指令设为true的时候会使用Debug版本,其他的情况都会使用Release版本。

<%@ Page Language="C#" Debug="true"

AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

2

3.Debug:客户端脚本使用Debug版本,除非retail属性设为true。
4.Release:客户端脚本使用Release版本,除非retail属性设为false。

四.错误处理
在页面回传时如果发生了异常AsyncPostBackError事件将被触发,错误信息的处理依赖于AllowCustomErrors属性、AsyncPostBackErrorMessage属性和Web.config中的<customErrors>配置区。下面看一个简单的错误处理例子,在AsyncPostBackError事件中捕获到异常信息并设置AsyncPostBackErrorMessage属性。
  1. <%@ Page Language="C#" %>

  2. <script runat="server">

  3.     protected void ErrorProcessClick_Handler(object sender, EventArgs e)

  4.     {
  5.         // This handler demonstrates an error condition. In this example

  6.         // the server error gets intercepted on the client and an alert is shown.

  7.         throw new ArgumentException();
  8.     }

  9.     protected void SuccessProcessClick_Handler(object sender, EventArgs e)

  10.     {
  11.         // This handler demonstrates no server side exception.

  12.         UpdatePanelMessage.Text = "The asynchronous postback completed successfully.";

  13.     }

  14.     protected void ScriptManager1_AsyncPostBackError(object sender, AsyncPostBackErrorEventArgs e)

  15.     {
  16.         ScriptManager1.AsyncPostBackErrorMessage = "异常信息为:" + e.Exception.Message;

  17.     }

  18. </script>


  19. <html xmlns="http://www.w3.org/1999/xhtml">

  20. <head id="Head1" runat="server">

  21.     <title>PageRequestManager endRequestEventArgs Example</title>

  22.     <style type="text/css">

  23.     body {}{

  24.         font-family: Tahoma;

  25.     }

  26.     #AlertDiv{}{

  27.     left: 40%; top: 40%;

  28.     position: absolute; width: 200px;

  29.     padding: 12px;

  30.     border: #000000 1px solid;

  31.     background-color: white;

  32.     text-align: left;

  33.     visibility: hidden;

  34.     z-index: 99;

  35.     }

  36.     #AlertButtons{}{

  37.     position: absolute;

  38.     right: 5%;

  39.     bottom: 5%;

  40.     }

  41.     </style>

  42. </head>

  43. <body id="bodytag">

  44.     <form id="form1" runat="server">

  45.         <div>

  46.             <asp:ScriptManager ID="ScriptManager1" runat="server"
  47.             OnAsyncPostBackError="ScriptManager1_AsyncPostBackError">

  48.             </asp:ScriptManager>

  49.             <script type="text/javascript" language="javascript">

  50.                 var divElem = 'AlertDiv';

  51.                 var messageElem = 'AlertMessage';

  52.                 var errorMessageAdditional = 'Please try again.';

  53.                 var bodyTag = 'bodytag';
  54.                 Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);

  55.                 function ToggleAlertDiv(visString)
  56.                 {
  57.                      if (visString == 'hidden')

  58.                      {
  59.                          $get(bodyTag).style.backgroundColor = 'white';                        
  60.                      }
  61.                      else
  62.                      {
  63.                          $get(bodyTag).style.backgroundColor = 'gray';                        

  64.                      }

  65.                      var adiv = $get(divElem);

  66.                      adiv.style.visibility = visString;

  67.                 }

  68.                 function ClearErrorState() {

  69.                      $get(messageElem).innerHTML = '';

  70.                      ToggleAlertDiv('hidden');                     

  71.                 }
  72.                 function EndRequestHandler(sender, args)

  73.                 {
  74.                    if (args.get_error() != undefined && args.get_error().httpStatusCode == '500')
  75.                    {

  76.                        var errorMessage = args.get_error().message

  77.                        args.set_errorHandled(true);

  78.                        ToggleAlertDiv('visible');

  79.                        $get(messageElem).innerHTML = '"' +

  80.                                 errorMessage + '" ' + errorMessageAdditional;

  81.                    }

  82.                 }

  83.             </script>

  84.             <asp:UpdatePanel runat="Server" UpdateMode="Conditional" ID="UpdatePanel1">

  85.                 <ContentTemplate>

  86.                     <asp:Panel ID="Panel1" runat="server" GroupingText="Update Panel">

  87.                         <asp:Label ID="UpdatePanelMessage" runat="server" />

  88.                         <br />

  89.                         Last update:

  90.                         <%= DateTime.Now.ToString() %>

  91.                         .

  92.                         <br />

  93.                         <asp:Button runat="server" ID="Button1" Text="Submit Successful Async Postback"

  94.                             OnClick="SuccessProcessClick_Handler" OnClientClick="ClearErrorState()" />

  95.                         <asp:Button runat="server" ID="Button2" Text="Submit Async Postback With Error"

  96.                             OnClick="ErrorProcessClick_Handler" OnClientClick="ClearErrorState()" />

  97.                         <br />

  98.                     </asp:Panel>

  99.                 </ContentTemplate>

  100.             </asp:UpdatePanel>

  101.             <div id="AlertDiv">

  102.                 <div id="AlertMessage">

  103.                 </div>

  104.                 <br />

  105.                 <div id="AlertButtons" >

  106.                     <input id="OKButton" type="button" value="OK"

  107.                            runat="server" onclick="ClearErrorState()" />

  108.                 </div>

  109.            </div>

  110.     </form>

  111. </body>

  112. </html>
复制代码
运行后时界面:
1.gif
发生异常信息:
2.gif

五.Services属性
Services用来管理对WebService的调用,通过<asp:ServiceReference>标签可以在Services中注册一个WebService,在运行时ScriptManager将为每一个ServiceReference对象生成一个客户端代理,<asp:ServiceReference>标签一个很重要的属性是Path,用来指定WebService的路径,如下所示:
  1. <asp:ScriptManager ID="SM1" runat="server">

  2.     <Services>

  3.         <asp:ServiceReference Path="Service.asmx"/>

  4.     </Services>
复制代码
</asp:ScriptManager>看一个简单的调用WebService的例子:
WebService如下,注意在WebServiceSample上加ScriptService特性:页面:
  1. [ScriptService]

  2. public class WebServiceSample : System.Web.Services.WebService {

  3.     public WebServiceSample()

  4.     {

  5.         //Uncomment the following line if using designed components

  6.         //InitializeComponent();

  7.     }


  8.     [WebMethod]

  9.     public string EchoString(String s)

  10.     {
  11.         return "Hello " + s;
  12.     }

  13. }ASPX



  14. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %>

  15. <html xmlns="http://www.w3.org/1999/xhtml" >

  16. <head runat="server">

  17.     <title>Untitled Page</title>

  18. </head>

  19. <script type="text/javascript" language="JavaScript">

  20.     function OnbuttonGo_click()

  21.     {
  22.         requestSimpleService = WebServiceSample.EchoString(

  23.             document.getElementById('inputName').value,       //params

  24.             OnRequestComplete    //Complete event

  25.             );

  26.         return false;
  27.     }

  28.     function OnRequestComplete(result)

  29.     {
  30.         alert(result);
  31.     }

  32. </script>

  33. <body>

  34.     <form id="form1" runat="server">

  35.     <asp:ScriptManager ID="ScriptManager1" runat="server">

  36.         <Services>

  37.             <asp:ServiceReference Path="WebServiceSample.asmx"/>

  38.         </Services>

  39.     </asp:ScriptManager>

  40.     <div>

  41.         <input type="text" id="inputName" size=20/>

  42.         <input id="button" type="button" value="调 用" onclick="return OnbuttonGo_click()" /></div>

  43.     </form>

  44. </body>

  45. </html>
复制代码
运行后效果如下:
3.gif
当然了也可以在运行时动态的在Services中加入ServiceReference,下面看一个运行时动态加入ServiceReference的例子:
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default3.aspx.cs" Inherits="Default3" %>

  2. <script runat="server">

  3.     void Page_Load(object sender, EventArgs e)

  4.     {

  5.         ServiceReference sr = new ServiceReference();

  6.         sr.Path = "WebServiceSample.asmx";

  7.         ScriptManager1.Services.Add(sr);

  8.     }

  9. </script>

  10. <html xmlns="http://www.w3.org/1999/xhtml" >

  11. <head runat="server">

  12.     <title>Untitled Page</title>

  13. </head>

  14. <script type="text/javascript" language="JavaScript">

  15.     function OnbuttonGo_click()

  16.     {

  17.         requestSimpleService = WebServiceSample.EchoString(

  18.             document.getElementById('inputName').value,       //params

  19.             OnRequestComplete    //Complete event

  20.             );

  21.         return false;

  22.     }



  23.     function OnRequestComplete(result)

  24.     {

  25.         alert(result);

  26.     }

  27. </script>



  28. <body>

  29.    

  30.     <form id="form1" runat="server">

  31.     <asp:ScriptManager ID="ScriptManager1" runat="server">

  32.     </asp:ScriptManager>

  33.     <div>

  34.         <input type="text" id="inputName" size=20/>

  35.         <input id="button" type="button" value="调 用" onclick="return OnbuttonGo_click()" /></div>

  36.     </form>

  37. </body>

  38. </html>
复制代码
可以看到运行后和在ScriptManager中直接加入的效果是一样的。
4.gif

六.Scripts属性
关于Scripts属性到后面具体再说吧,最主要的属性有Path指定脚本的路径,ScriptMode指定客户端脚本的模式,它会覆盖ScriptManager中的ScriptMode属性,还有一个属性是IgnoreScriptPath,指定是否忽略掉ScriptManager中的ScriptPath属性。
关于ScriptManager控件就学习到这里了,至于AuthenticationService属性和ProfileService属性都很简单。

示例代码下载:http://files.cnblogs.com/Terrylee/ASPNETAJAXScriptManagerDemo.rar
 楼主| 无处不在 发表于 2010-5-13 10:53 | 显示全部楼层
ASP.NET AJAX入门系列(3):使用ScriptManagerProxy控件

在ASP.NET AJAX中,由于一个ASPX页面上只能有一个ScriptManager控件,所以在有母版页的情况下,如果需要在Master-Page和Content-Page中需要引入不同的脚本时,这就需要在Content-page中使用ScriptManagerProxy,而不是ScriptManager,ScriptManager 和 ScriptManagerProxy 是两个非常相似的控件。
主要内容
1.ScriptManagerProxy控件概述
2.简单示例

一.ScriptManagerProxy控件概述
在ASP.NET AJAX中,由于一个ASPX页面上只能有一个ScriptManager控件,所以在有Master-Page的情况下,如果需要在Master-Page和Content-Page中需要引入不同的脚本时,就需要在Content-page中使用ScriptManagerProxy,而不是ScriptManager,ScriptManagerProxy和 ScriptManager是两个非常相似的控件。简单定义形式如下:
  1. <asp:ScriptManagerProxy id="ScriptManagerProxy1" runat="server">

  2.     <Services>

  3.                 <asp:ServiceReference Path="CalculWebService.asmx" />

  4.      </Services>

  5. </asp:ScriptManagerProxy>
复制代码
在它下面可以添加的子标签有:Services,Scripts,AuthenticationService,ProfileService


二.简单示例
下面看一个简单的使用ScriptManagerProxy的例子。
1.首先我们准备两个WebService,在Master-Page中我们输入一个字符串,而在Content-Page中我们求两个数的和。
SimpleWebService.asmx.添加一个Master-Page,在它上面添加一个ScriptManager控件,并引入WebService SimpleWebService.asmx,并添加相应的HTML元素:.添加一个Content-Page,在它上面添加一个ScriptManagerProxy控件,并引入WebService CalculWebService.asmx,并添加相应的HTML元素:
  1. [ScriptService]

  2. public class SimpleWebService : System.Web.Services.WebService {

  3.     public SimpleWebService () {

  4.         //Uncomment the following line if using designed components

  5.         //InitializeComponent();

  6.     }

  7.     [WebMethod]

  8.     public string EchoString(String s)

  9.     {
  10.         return "Hello " + s;
  11.     }

  12. }CalculWebService.asmx

  13. [ScriptService]

  14. public class CalculWebService : System.Web.Services.WebService {

  15.     public CalculWebService () {

  16.         //Uncomment the following line if using designed components

  17.         //InitializeComponent();

  18.     }


  19.     [WebMethod]

  20.     public int Add(int a,int b) {

  21.         return a + b;
  22.     }
  23. }
复制代码
2

  1. <div>

  2.     <asp:ScriptManager ID="ScriptManager1" runat="server" >

  3.         <Services>

  4.             <asp:ServiceReference Path="SimpleWebService.asmx" />

  5.         </Services>

  6.     </asp:ScriptManager>

  7.     <asp:contentplaceholder id="ContentPlaceHolder1" runat="server">

  8.     </asp:contentplaceholder>

  9.     &nbsp;<h3>请输入名称:</h3>

  10.     <input id="inputName" type="text" />

  11.     <input id="button" type="button" value="确 定" onclick="return OnbuttonGo_click()" />

  12. </div>
复制代码
编写相应的JS代码:
  1. <script type="text/javascript" language="JavaScript">

  2.     function OnbuttonGo_click()

  3.     {
  4.         requestSimpleService = SimpleWebService.EchoString(

  5.             document.getElementById('inputName').value,       //params

  6.             OnRequestComplete    //Complete event

  7.             );

  8.         return false;
  9.     }

  10.     function OnRequestComplete(result)

  11.     {
  12.         alert(result);
  13.     }

  14. </script>
复制代码
3
  1. <div>

  2.     <asp:ScriptManagerProxy id="ScriptManagerProxy1" runat="server">

  3.         <Services>

  4.                     <asp:ServiceReference Path="CalculWebService.asmx" />

  5.          </Services>

  6.     </asp:ScriptManagerProxy>

  7.     <h3>请输入两个数:</h3>&nbsp;<input id="inputA" type="text" style="width: 110px" />&nbsp;+&nbsp;

  8.     <input id="inputB" style="width: 110px" type="text" />&nbsp;

  9.     <input id="buttonEqual" type="button" value=" = "  onclick="return OnbuttonEqual_click()"/>

  10. </div>
复制代码
编写相应的JS代码:
  1. <script type="text/javascript" language="JavaScript">

  2.     function OnbuttonEqual_click()
  3.     {
  4.         requestSimpleService = CalculWebService.Add(

  5.             document.getElementById('inputA').value,       //params

  6.             document.getElementById('inputB').value,       //params

  7.             OnRequestComplete    //Complete event

  8.             );

  9.         return false;
  10.     }

  11.     function OnRequestComplete(result)

  12.     {
  13.         alert(result);
  14.     }

  15. </script>
复制代码
4.运行后界面如下:
ASPNETAJAX_005.gif

测试Master-Page中的Web Service:
ASPNETAJAX_006.gif
测试Content-Page中的Web Service:
ASPNETAJAX_007.gif
关于ScriptManagerProxy就介绍到这儿,有个问题就是在我的IDE中为什么ScriptManagerProxy总是提示为未知元素,但运行起来并不抱错,结果也可以出来?
示例代码下载:/Files/Terrylee/ASPNETAJAXScriptManagerProxyDemo.rar
joe 发表于 2010-5-13 10:57 | 显示全部楼层
ASP.NET AJAX入门系列(4):使用UpdatePanel控件(一)
UpdatePanel可以用来创建丰富的局部更新Web应用程序,它是ASP.NET 2.0 AJAX Extensions中很重要的一个控件,其强大之处在于不用编写任何客户端脚本,只要在一个页面上添加几个UpdatePanel控件和一个ScriptManager控件就可以自动实现局部更新。通过本文来学习一下UpdatePanel简单的使用方法(第一篇)。

主要内容
1.UpdatePanel控件概述
2.UpdatePanel工作原理
3.ContentTemplate属性
4.ContentTemplateContainer属性
5.Triggers属性

一.UpdatePanel控件概述
UpdatePanel可以用来创建丰富的局部更新Web应用程序,它是ASP.NET 2.0 AJAX Extensions中很重要的一个控件,其强大之处在于不用编写任何客户端脚本,只要在一个页面上添加几个UpdatePanel控件和一个ScriptManager控件就可以自动实现局部更新。通过本文来学习一下UpdatePanel工作原理和使用方法。简单的UpdatePanel定义如下:重要的属性如下:
  1. <asp:UpdatePanel ID="UpdatePanel1" runat="server">

  2.     <ContentTemplate>

  3.         <!---->

  4.     </ContentTemplate>

  5.     <Triggers>

  6.         <asp:AsyncPostBackTrigger />

  7.         <asp:PostBackTrigger />

  8.     </Triggers>

  9. </asp:UpdatePanel>UpdatePanel
复制代码
属性
说明

ChildrenAsTriggers
当UpdateMode属性为Conditional时,UpdatePanel中的子控件的异步回送是否会引发UpdatePanle的更新。

RenderMode
表示UpdatePanel最终呈现的HTML元素。Block(默认)表示<div>,Inline表示<span>

UpdateMode
表示UpdatePanel的更新模式,有两个选项:Always和Conditional。Always是不管有没有Trigger,其他控件都将更新该UpdatePanel,Conditional表示只有当前UpdatePanel的Trigger,或ChildrenAsTriggers属性为true时当前UpdatePanel中控件引发的异步回送或者整页回送,或是服务器端调用Update()方法才会引发更新该UpdatePanel。



二.UpdatePanel工作原理
UpdatePanel的工作依赖于ScriptManager服务端控件(ASP.NET AJAX入门系列(2):使用ScriptManager控件)和客户端PageRequestManager类(Sys.WebForms.PageRequestManager,在后面的客户端类中会专门说到),当ScriptManager中允许页面局部更新时,它会以异步的方式回传给服务器,与传统的整页回传方式不同的是只有包含在UpdatePanel中的页面部分会被更新,在从服务端返回HTML之后,PageRequestManager会通过操作DOM对象来替换需要更新的代码片段。
看一下官方网站提供的UpdatePanel工作原理图:
ASPNETAJAX_008.gif
三.ContentTemplate属性
Contente Template标签用来定义UpdatePanel的内容,在它里面可以放任何ASP.NET元素。如果你想要使用编程的手法来控制UpdatePanel中的内容,就需要使用ContenteTemplateContainer,下面会说到,先来看一个简单的ContentTemplate的例子。四.ContentTemplateContainer属性
  1. <asp:UpdatePanel ID="UpdatePanel1" runat="server">

  2.     <ContentTemplate>

  3.         <asp:Calendar ID="Calendar1" ShowTitle="True" runat="server" />

  4.         <div>

  5.             Background:

  6.             <br />

  7.             <asp:DropDownList ID="ColorList" AutoPostBack="True" OnSelectedIndexChanged="DropDownSelection_Change"

  8.                 runat="server">

  9.                 <asp:ListItem Selected="True" Value="White">

  10.                 White </asp:ListItem>

  11.                 <asp:ListItem Value="Silver">

  12.                 Silver </asp:ListItem>

  13.                 <asp:ListItem Value="DarkGray">

  14.                 Dark Gray </asp:ListItem>

  15.                 <asp:ListItem Value="Khaki">

  16.                 Khaki </asp:ListItem>

  17.                 <asp:ListItem Value="DarkKhaki"> D

  18.                 ark Khaki </asp:ListItem>

  19.             </asp:DropDownList>

  20.         </div>

  21.     </ContentTemplate>

  22. </asp:UpdatePanel>
复制代码
事件代码:
  1. <script runat="server">

  2.     void DropDownSelection_Change(Object sender, EventArgs e)

  3.     {

  4.         Calendar1.DayStyle.BackColor =

  5.             System.Drawing.Color.FromName(ColorList.SelectedItem.Value);

  6.     }

  7. </script>
复制代码
如果要使用编程的手法去设置UpdatePanel中的内容,需要创建一个UpdatePanel,并且添加控件到ContentTemplateContainer,而不能直接添加控件到ContentTemplate,如果想直接设置ContentTemplate,则需要编写一个自定义的Template,并去实现位于System.Web.UI命名空间下的接口ITemplate。看一个简单的来自于官方网站的例子:
  1. <%@ Page Language="C#" %>

  2. <script runat="server">

  3.     protected void Page_Load(object sender, EventArgs e)

  4.     {

  5.         UpdatePanel up1 = new UpdatePanel();

  6.         up1.ID = "UpdatePanel1";

  7.         up1.UpdateMode = UpdatePanelUpdateMode.Conditional;

  8.         Button button1 = new Button();

  9.         button1.ID = "Button1";

  10.         button1.Text = "Submit";

  11.         button1.Click += new EventHandler(Button_Click);

  12.         Label label1 = new Label();

  13.         label1.ID = "Label1";

  14.         label1.Text = "A full page postback occurred.";

  15.         up1.ContentTemplateContainer.Controls.Add(button1);

  16.         up1.ContentTemplateContainer.Controls.Add(label1);

  17.         Page.Form.Controls.Add(up1);

  18.     }

  19.     protected void Button_Click(object sender, EventArgs e)

  20.     {

  21.         ((Label)Page.FindControl("Label1")).Text = "Panel refreshed at " +

  22.             DateTime.Now.ToString();

  23.     }

  24. </script>

  25. <html xmlns="http://www.w3.org/1999/xhtml">

  26. <head id="Head1" runat="server">

  27.     <title>UpdatePanel Added Programmatically Example</title>

  28. </head>

  29. <body>

  30.     <form id="form1" runat="server">

  31.         <div>

  32.             <asp:ScriptManager ID="TheScriptManager"

  33.                                runat="server" />

  34.         </div>

  35.     </form>

  36. </body>

  37. </html>
复制代码
五.Triggers属性
在ASP.NET AJAX中有两种Triggers:分别为AsyncPostBackTrigger和PostBackTrigger,AsyncPostBackTrigge用来指定某个服务器端控件以及其将触发的服务器端事件作为该UpdatePanel的异步更新触发器,它需要设置的属性有控件ID和服务端控件的事件;PostBackTrigger用来指定在UpdatePanel中的某个服务端控件,它所引发的回送不使用异步回送,而仍然是传统的整页回送。这一点跟Atlas有很大的区别,大家需要注意。看一个小例子,虽然两个Button都放在了UpdatePanel中,但是由于在PostBackTrigger中指定了Button2,所以它使用的仍然是整页回送。
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>

  2. <script runat="server">

  3.     void Button1_Click(object sender, EventArgs e)

  4.     {
  5.         this.Label1.Text = "更新时间:" + System.DateTime.Now.ToString();
  6.     }

  7.     void Button2_Click(object sender, EventArgs e)

  8.     {
  9.         this.Label1.Text = "更新时间:" + System.DateTime.Now.ToString();
  10.     }

  11. </script>

  12. <html xmlns="http://www.w3.org/1999/xhtml" >

  13. <head runat="server">

  14.     <title>UpdatePanel Trigger Sample</title>

  15. </head>

  16. <body>

  17.     <form id="form1" runat="server">

  18.     <div>

  19.         <asp:ScriptManager ID="ScriptManager1" runat="server">

  20.         </asp:ScriptManager>

  21.     </div>

  22.         <asp:UpdatePanel ID="UpdatePanel1" runat="server">

  23.             <ContentTemplate>

  24.                 <div>

  25.                     <asp:Button ID="Button1" runat="server" Text="异步回送" OnClick="Button1_Click"/>&nbsp;&nbsp;

  26.                     <asp:Button ID="Button2" runat="server" Text="整页回送" OnClick="Button2_Click"/><br />

  27.                     <br />

  28.                     <asp:Label ID="Label1" runat="server" Text="当前时间" Font-Bold="True" Font-Size="Large"></asp:Label></div>

  29.             </ContentTemplate>

  30.             <Triggers>

  31.                 <asp:AsyncPostBackTrigger ControlID="Button1"/>

  32.                 <asp:PostBackTrigger ControlID="Button2" />

  33.             </Triggers>

  34.         </asp:UpdatePanel>

  35.     </form>

  36. </body>

  37. </html>
复制代码
(未完待续)
示例代码下载:http://files.cnblogs.com/Terrylee/ASPNETAJAXUpdatePanelDemo1
joe 发表于 2010-5-13 11:05 | 显示全部楼层
ASP.NET AJAX入门系列(5):使用UpdatePanel控件(二)

UpdatePanel可以用来创建丰富的局部更新Web应用程序,它是ASP.NET 2.0 AJAX Extensions中很重要的一个控件,其强大之处在于不用编写任何客户端脚本,只要在一个页面上添加几个UpdatePanel控件和一个ScriptManager控件就可以自动实现局部更新。通过本文来学习一下UpdatePanel其他的一些使用方法(第二篇)。

主要内容
1.用编程的方法控制UpdatePanel的更新
2.UpdatePanel的嵌套使用
3.同一页面上使用多个UpdatePanel

一.用编程的方法控制UpdatePanel的更新
对于UpdatePanel,我们也可以使用编程的方法来控制它的更新,可以通过ScriptManager的RegisterAsyncPostBackControl()方法注册一个异步提交的控件,并且调用UpdatePanel的Update()方法来让它更新。再次用我在前面的文章中用到的一个无聊的时间更新例子来看一下,有时候我觉得例子过于复杂更加不好说明白所要讲的内容,如下代码所示,注意Button1并不包含在UpdatePanel中:

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

  2. <script runat="server">

  3.     void Button1_Click(object sender, EventArgs e)

  4.     {

  5.         this.Label2.Text = DateTime.Now.ToString();

  6.     }

  7. </script>

  8. <html xmlns="http://www.w3.org/1999/xhtml">

  9. <head runat="server">

  10.     <title>Refreshing an UpdatePanel Programmatically</title>

  11. </head>

  12. <body>

  13.     <form id="form1" runat="server">

  14.         <asp:ScriptManager ID="ScriptManager1" runat="server"/>

  15.         <div>

  16.             <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">

  17.                 <ContentTemplate>

  18.                     <asp:Label ID="Label1" runat="server" Text="更新时间:"></asp:Label>

  19.                     <asp:Label ID="Label2" runat="server" Text="Label" ForeColor="Red"></asp:Label><br/><br/>

  20.                     

  21.                 </ContentTemplate>

  22.             </asp:UpdatePanel>

  23.              <asp:Button ID="Button1" runat="server" Text="Button"  OnClick = "Button1_Click"/>

  24.         </div>

  25.     </form>

  26. </body>

  27. </html>
复制代码
这时候不用多说,肯定是整页提交了,运行如下图所示:
ASPNETAJAX_009.gif
再次修改上面的例子,使用ScriptManager的RegisterAsyncPostBackControl()注册Button1为一个异步提交控件,并且调用UpdatePanel的Update()方法:

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

  2. <script runat="server">

  3.     void Page_Load(object sender, EventArgs e)

  4.     {

  5.         ScriptManager1.RegisterAsyncPostBackControl(Button1);

  6.     }

  7.    

  8.     void Button1_Click(object sender, EventArgs e)

  9.     {

  10.         this.Label2.Text = DateTime.Now.ToString();

  11.         this.UpdatePanel1.Update();

  12.     }

  13. </script>

  14. <html xmlns="http://www.w3.org/1999/xhtml">

  15. <head runat="server">

  16.     <title>Refreshing an UpdatePanel Programmatically</title>

  17. </head>

  18. <body>

  19.     <form id="form1" runat="server">

  20.         <asp:ScriptManager ID="ScriptManager1" runat="server"/>

  21.         <div>

  22.             <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">

  23.                 <ContentTemplate>

  24.                     <asp:Label ID="Label1" runat="server" Text="更新时间:"></asp:Label>

  25.                     <asp:Label ID="Label2" runat="server" Text="Label" ForeColor="Red"></asp:Label><br/><br/>

  26.                     

  27.                 </ContentTemplate>

  28.             </asp:UpdatePanel>

  29.              <asp:Button ID="Button1" runat="server" Text="Button"  OnClick = "Button1_Click"/>

  30.         </div>

  31.     </form>

  32. </body>

  33. </html>
复制代码
这时候可以看到,已经是异步提交了:
ASPNETAJAX_010.gif
二. UpdatePanel的嵌套使用
UpdatePanel还可以嵌套使用,即在一个UpdatePanel的ContentTemplate中还可以放入另一个UpdatePanel。当最外面的UpdatePanel被触发更新时,它里面的子UpdatePanel也随着更新,里面的UpdatePanel触发更新时,只更新它自己,而不会更新外层的UpdatePanel。看下面的例子:

  1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default2.aspx.cs" Inherits="Default2" %>

  2. <script runat="server">

  3. </script>



  4. <html xmlns="http://www.w3.org/1999/xhtml">

  5. <head id="Head1" runat="server">

  6.     <title>UpdatePanelUpdateMode Example</title>

  7.     <style type="text/css">

  8.     div.NestedPanel

  9.     {}{

  10.       position: relative;

  11.       margin: 2% 5% 2% 5%;

  12.     }

  13.     </style>

  14. </head>

  15. <body>

  16.     <form id="form1" runat="server">

  17.         <div>

  18.             <asp:ScriptManager ID="ScriptManager"

  19.                                runat="server" />

  20.             <asp:UpdatePanel ID="OuterPanel"

  21.                              UpdateMode="Conditional"

  22.                              runat="server">

  23.                 <ContentTemplate>

  24.                     <div>

  25.                         <fieldset>

  26.                             <legend>Outer Panel </legend>

  27.                             <br />

  28.                             <asp:Button ID="OPButton1"

  29.                                         Text="Outer Panel Button"

  30.                                         runat="server" />

  31.                             <br />

  32.                             Last updated on

  33.                             <%= DateTime.Now.ToString() %>

  34.                             <br />

  35.                             <br />

  36.                             <asp:UpdatePanel ID="NestedPanel1"

  37.                                                UpdateMode="Conditional"

  38.                                                runat="server">

  39.                                 <ContentTemplate>

  40.                                     <div class="NestedPanel">

  41.                                         <fieldset>

  42.                                             <legend>Nested Panel 1</legend>

  43.                                             <br />

  44.                                             Last updated on

  45.                                             <%= DateTime.Now.ToString() %>

  46.                                             <br />

  47.                                             <asp:Button ID="NPButton1"

  48.                                                         Text="Nested Panel 1 Button"

  49.                                                         runat="server" />

  50.                                         </fieldset>

  51.                                     </div>

  52.                                 </ContentTemplate>

  53.                             </asp:UpdatePanel>

  54.                         </fieldset>

  55.                     </div>

  56.                 </ContentTemplate>

  57.             </asp:UpdatePanel>

  58.         </div>

  59.     </form>

  60. </body>

  61. </html>
复制代码
运行后如下:
ASPNETAJAX_011.gif


三.同一页面上使用多个UpdatePanel
使用UpdatePanel的时候并没有限制在一个页面上用多少个UpdatePanel,所以我们可以为不同的需要局部更新的页面区域加上不同的UpdatePanel。由于UpdatePanel默认的UpdateMode是Always,如果页面上有一个局部更新被触发,则所有的UpdatePanel都将更新,这是我们不愿看到的,我们只需要UpdatePanel在它自己的触发器触发的时候更新就可以了,所以需要把UpdateMode设置为Conditional。
来看一下官方网站上提供的一个例子:包括两个UpdatePanel,其中一个用来用户输入而另一个则用来显示数据,每一个UpdatePanel的UpdateMode属性都设置为Conditional。当我们单击Cancel按钮时,只有用来用户输入的那个UpdatePanel刷新,当单击Insert按钮时,两个UpdatePanel都刷新。代码如下:

  1. <%@ Page Language="C#" %>

  2. <%@ Import Namespace="System.Collections.Generic" %>



  3. <html xmlns="http://www.w3.org/1999/xhtml" >

  4. <head id="Head1" runat="server">

  5.     <title>Enter New Employees</title>

  6.     <script runat="server">

  7.         private List<Employee> EmployeeList;



  8.         protected void Page_Load()

  9.         {

  10.             if (!IsPostBack)

  11.             {

  12.                 EmployeeList = new List<Employee>();

  13.                 EmployeeList.Add(new Employee(1, "Jump", "Dan"));

  14.                 EmployeeList.Add(new Employee(2, "Kirwan", "Yvette"));

  15.                 ViewState["EmployeeList"] = EmployeeList;

  16.             }

  17.             else

  18.                 EmployeeList = (List<Employee>)ViewState["EmployeeList"];

  19.             

  20.             EmployeesGridView.DataSource = EmployeeList;

  21.             EmployeesGridView.DataBind();

  22.         }

  23.         

  24.         protected void InsertButton_Click(object sender, EventArgs e)

  25.         {

  26.             if (String.IsNullOrEmpty(FirstNameTextBox.Text) ||

  27.                String.IsNullOrEmpty(LastNameTextBox.Text)) { return; }



  28.             int employeeID = EmployeeList[EmployeeList.Count-1].EmployeeID + 1;

  29.             

  30.             string lastName = Server.HtmlEncode(FirstNameTextBox.Text);

  31.             string firstName = Server.HtmlEncode(LastNameTextBox.Text);

  32.             

  33.             FirstNameTextBox.Text = String.Empty;

  34.             LastNameTextBox.Text = String.Empty;

  35.             

  36.             EmployeeList.Add(new Employee(employeeID, lastName, firstName));

  37.             ViewState["EmployeeList"] = EmployeeList;

  38.             

  39.             EmployeesGridView.DataBind();

  40.             EmployeesGridView.PageIndex = EmployeesGridView.PageCount;

  41.         }



  42.         protected void CancelButton_Click(object sender, EventArgs e)

  43.         {

  44.             FirstNameTextBox.Text = String.Empty;

  45.             LastNameTextBox.Text = String.Empty;

  46.         }

  47.    

  48.         [Serializable]

  49.         public class Employee

  50.         {

  51.             private int _employeeID;

  52.             private string _lastName;

  53.             private string _firstName;



  54.             public int EmployeeID

  55.             {

  56.                 get { return _employeeID; }

  57.             }

  58.             

  59.             public string LastName

  60.             {

  61.                 get { return _lastName; }

  62.             }

  63.             

  64.             public string FirstName

  65.             {

  66.                 get { return _firstName; }

  67.             }

  68.             

  69.             public Employee(int employeeID, string lastName, string firstName)

  70.             {

  71.                 _employeeID = employeeID;

  72.                 _lastName = lastName;

  73.                 _firstName = firstName;

  74.             }

  75.         }



  76.     </script>

  77. </head>

  78. <body>

  79.     <form id="form1" runat="server">

  80.     <div>

  81.         &nbsp;</div>

  82.         <asp:ScriptManager ID="ScriptManager1" runat="server" EnablePartialRendering="true" />

  83.         <table>

  84.             <tr>

  85.                 <td style="height: 206px" valign="top">

  86.                     <asp:UpdatePanel ID="InsertEmployeeUpdatePanel" runat="server" UpdateMode="Conditional">

  87.                         <ContentTemplate>

  88.                           <table cellpadding="2" border="0" style="background-color:#7C6F57">

  89.                             <tr>

  90.                               <td><asp:Label ID="FirstNameLabel" runat="server" AssociatedControlID="FirstNameTextBox"

  91.                                              Text="First Name" ForeColor="White" /></td>

  92.                               <td><asp:TextBox runat="server" ID="FirstNameTextBox" /></td>

  93.                             </tr>

  94.                             <tr>

  95.                               <td><asp:Label ID="LastNameLabel" runat="server" AssociatedControlID="LastNameTextBox"

  96.                                              Text="Last Name" ForeColor="White" /></td>

  97.                               <td><asp:TextBox runat="server" ID="LastNameTextBox" /></td>

  98.                             </tr>

  99.                             <tr>

  100.                               <td></td>

  101.                               <td>

  102.                                 <asp:LinkButton ID="InsertButton" runat="server" Text="Insert" OnClick="InsertButton_Click" ForeColor="White" />

  103.                                 <asp:LinkButton ID="Cancelbutton" runat="server" Text="Cancel" OnClick="CancelButton_Click" ForeColor="White" />

  104.                               </td>

  105.                             </tr>

  106.                           </table>

  107.                           <asp:Label runat="server" ID="InputTimeLabel"><%=DateTime.Now %></asp:Label>

  108.                         </ContentTemplate>

  109.                     </asp:UpdatePanel>

  110.                 </td>

  111.                 <td style="height: 206px" valign="top">

  112.                     <asp:UpdatePanel ID="EmployeesUpdatePanel" runat="server" UpdateMode="Conditional">

  113.                         <ContentTemplate>

  114.                             <asp:GridView ID="EmployeesGridView" runat="server" BackColor="LightGoldenrodYellow" BorderColor="Tan"

  115.                                 BorderWidth="1px" CellPadding="2" ForeColor="Black" GridLines="None" AutoGenerateColumns="False">

  116.                                 <FooterStyle BackColor="Tan" />

  117.                                 <SelectedRowStyle BackColor="DarkSlateBlue" ForeColor="GhostWhite" />

  118.                                 <PagerStyle BackColor="PaleGoldenrod" ForeColor="DarkSlateBlue" HorizontalAlign="Center" />

  119.                                 <HeaderStyle BackColor="Tan" Font-Bold="True" />

  120.                                 <AlternatingRowStyle BackColor="PaleGoldenrod" />

  121.                                 <Columns>

  122.                                     <asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" />

  123.                                     <asp:BoundField DataField="LastName" HeaderText="Last Name" />

  124.                                     <asp:BoundField DataField="FirstName" HeaderText="First Name" />

  125.                                 </Columns>

  126.                                 <PagerSettings PageButtonCount="5" />

  127.                             </asp:GridView>

  128.                             <asp:Label runat="server" ID="ListTimeLabel"><%=DateTime.Now %></asp:Label>

  129.                         </ContentTemplate>

  130.                         <Triggers>

  131.                             <asp:AsyncPostBackTrigger ControlID="InsertButton" EventName="Click" />

  132.                         </Triggers>

  133.                     </asp:UpdatePanel>

  134.                 </td>

  135.             </tr>

  136.         </table>

  137.     </form>

  138. </body>

  139. </html>
复制代码
运行后效果如下:
ASPNETAJAX_012.gif

示例代码下载:http://files.cnblogs.com/Terrylee/ASPNETAJAXUpdatePanelDemo2.rar
joe 发表于 2010-5-13 11:14 | 显示全部楼层
ASP.NET AJAX入门系列(6):UpdateProgress控件简单介绍

在ASP.NET AJAX Beta2中,UpdateProgress控件已经从“增值”CTP中移到了ASP.NET AJAX核心中。以下两篇关于UpdateProgress的文章基本翻译自ASP.NET AJAX官方网站。

主要内容
1.UpdateProgress控件简单使用
2.使用多个UpdateProgress控件

一.UpdateProgress控件简单使用
1.创建一个Web页面并切换到设计视图。
2.在工具箱的AJAX Extensions标签下,双击ScriptManager控件添加到页面中。
3.双击UpdatePanel控件添加到页面中。

Tutorial6Step1.jpg 4.双击UpdateProgress控件添加到页面中。
5.在UpdateProgress控件中添加文本“Progress……”。
Tutorial6Step2.jpg
6.在UpdatePanel中添加一个Button和一个Label。
7.设置Label的Text属性值为“Initial Page Rendered”。
Tutorial6Step3.jpg
8.双击Button添加Click事件。
9.在Buttond的Click事件处理中添加如下代码,这里人为的创建一个3秒钟的延迟并显示当前时间。.保存并按Ctrl + F5运行。
  1. protected void Button1_Click(object sender, EventArgs e)

  2. {
  3.     // Introducing delay for demonstration.

  4.     System.Threading.Thread.Sleep(3000);

  5.     Label1.Text = "Page refreshed at " +

  6.         DateTime.Now.ToString();

  7. }
复制代码
10

11.单击Button,界面如下:
ASPNETAJAX_015.gif
二.使用多个UpdateProgress控件
默认情况下,UpdageProgress控件将显示页面上所有的UpdatePanel控件更新的进度信息,在以前版本的UpdateProgress中,我们无法设置UpdateProgress只显示某一个UpdatePanel的更新,最新版本的UpdateProgress控件提供了AssociatedUpdatePanelID属性,可以指定UpdateProgress控件显示哪一个UpdatePanel控件。下面的这个例子中UpdateProgrss控件将只显示它所在的UpdatePanel更新信息。
1.创建一个Web页面并切换到设计视图。
2.在工具箱的AJAX Extensions标签下,双击ScriptManager控件添加到页面中。
3.双击UpdatePanel控件两次添加两个UpdatePanel控件到页面中。
Tutorial7Step1.jpg

4.在每一个UpdatePanel中分别添加一个Label和Button。
5.分别设置两个Label的Text属性值为“Initial Page Rendered”。(官方网站这步有些问题)
Tutorial7Step2.jpg

6.双击每一个Button控件添加Click事件。
7.在Buttond的Click事件处理中添加如下代码,这里人为的创建一个3秒钟的延迟并显示当前时间。.切换到设计视图。
  1. protected void Button1_Click(object sender, EventArgs e)
  2. {
  3.     // Introducing delay for demonstration.

  4.     System.Threading.Thread.Sleep(3000);

  5.     Label1.Text = "Page refreshed at " +

  6.         DateTime.Now.ToString();
  7. }

  8. protected void Button2_Click(object sender, EventArgs e)

  9. {
  10.     // Introducing delay for demonstration.

  11.     System.Threading.Thread.Sleep(3000);

  12.     Label2.Text = "Page refreshed at " +

  13.         DateTime.Now.ToString();
  14. }
复制代码
8

9.在第一个UpdatePanel中添加UpdateProgrss控件,并添加文本Panel1 updating…
Tutorial7Step4.jpg

10.在第二个UpdatePanel中添加UpdateProgress控件,Panel2 updating…
Tutorial7Step5.jpg

11.保存并按Ctrl + F5运行
12.单击第一个UpdatePanel中的Button按钮,进度信息只显示在第一个UpdatePanel中。
ASPNETAJAX_014.gif

13.单击第二个UpdatePanel中的Button按钮,进度信息只显示在第二个UpdatePanel中。
ASPNETAJAX_013.gif
 楼主| 无处不在 发表于 2010-5-13 11:24 | 显示全部楼层
ASP.NET AJAX入门系列(7):使用客户端脚本对UpdateProgress

在本篇文章中,我们将通过编写JavaScript来使用客户端行为扩展UpdateProgress控件,客户端代码将使用ASP.NET AJAX Library中的PageRequestManager,在UpdateProgress控件中,将添加一个Button,来允许用户取消异步更新,并且使用客户端脚本来显示或者隐藏进度信息。


主要内容
1.通过客户端脚本取消异步更新
2.通过客户端脚本显示或者隐藏进度信息


一.通过客户端脚本取消异步更新
1.创建一个Web页面并切换到设计视图。
2.在工具箱中双击ScriptManager、UpdatePanel、UpdateProgress控件添加到页面中。添加后页面如下:
ASPNETAJAX_016.gif

3.在UpdatePanel控件中添加一个Label控件并设置它的Text属性值为“Panel Rendered”。
4.添加一个Button控件并设置它的Text属性值为“refresh”。
5.在UpdateProgress控件中添加文本text Processing…,并添加一个HtmlButton控件并设置它的Text属性为cancle。
ASPNETAJAX_017.gif

6.双击refresh控件添加Click事件。
7.在Buttond的Click事件处理中添加如下代码,人为的创建一个3秒钟的延迟并显示当前服务器的时间。

  1. protected void Button1_Click(object sender, EventArgs e)
  2. {
  3.     System.Threading.Thread.Sleep(3000);

  4.     Label1.Text = DateTime.Now.ToString();
  5. }
复制代码
8.添加如下脚本,获取一个当前PageRequestManager类的实例,并创建一个函数调用abortPostBack方法来停止异步更新。

  1. <script language="javascript" type="text/javascript">
  2. <!--
  3. var prm = Sys.WebForms.PageRequestManager.getInstance();

  4. function CancelAsyncPostBack() {

  5.     if (prm.get_isInAsyncPostBack()) {

  6.       prm.abortPostBack();

  7.     }
  8. }
  9. // -->
  10. </script>
复制代码
9.设置HtmlButton的click特性为CancelAsyncPostBack。
UPTutorial10Step1.jpg

10.添加如下的样式块到<head>元素之间。

  1. <style type="text/css">

  2. #UpdatePanel1 {}{

  3.   width:200px; height:100px;

  4.   border: 1px solid gray;

  5. }

  6. #UpdateProgress1 {}{

  7.   width:200px; background-color: #FFC080;

  8.   bottom: 0%; left: 0px; position: absolute;

  9. }

  10. </style>
复制代码
11.保存并按Ctrl + F5运行。
12.单击refresh按钮,经过短暂的延时之后显示进度信息,完成异步更新之后UpdatePanel中的信息显示为当前的服务器时间。
UPTutorial10Step2.jpg

13.单击refresh按钮并立即单击Cancle按钮结束异步更新,注意到UpdatePanel中的时间信息并没有更新。
二.通过客户端脚本显示或者隐藏进度信息
在下列情况下,UpdateProgress控件将不会自动显示:
    由UpdateProgress控件关联的UpdatePanel之外的控件引发的异步更新。
    UpdateProgress控件没有关联任何UpdatePanel,不在UpdatePanel中的控件引发的异步更新(例如用代码实现的更新)。
下面的例子将展示一个不在UpdateProgress所关联的UpdatePanel中的控件所引发的异步更新时,如何显示UpdateProgress控件。
1.在我们前面所创建的页面中,切换到设计视图。
2.选中UpdateProgress控件,在属性窗口中,设置AssociatedUpdatePanelID属性为UpdatePanel1。
UPTutorial10Step5.jpg

3.在UpdatePanel和UpdateProgress控件之外添加一个Button控件。
4.设置Button的Text属性值为Trigger,并设置ID属性为Panel1Trigger。
UPTutorial11Step1.jpg

5.选择UpdatePanel控件,在属性窗口中Triggers属性行单击ellipsis (…)。
6.创建一个异步更新触发器,并设置控件ID为Panel1Trigger。
UPTutorial11Step2.jpg

7.双击Trigger按钮添加Click事件。
8.在Buttond的Click事件处理中添加如下代码,人为的创建一个3秒钟的延迟并显示当前服务器的时间,并附加上一条信息表示是由触发器引发的异步更新。

  1. protected void Panel1Trigger_Click(object sender, EventArgs e)
  2. {
  3.     System.Threading.Thread.Sleep(3000);

  4.     Label1.Text = DateTime.Now.ToString() + " - trigger";
  5. }
复制代码
9.在代码窗口,在已有的<Script>脚本块中添加如下代码:
UPTutorial11Step3.jpg

  1. <script language="javascript" type="text/javascript">

  2. <!--

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

  4. function CancelAsyncPostBack() {

  5.     if (prm.get_isInAsyncPostBack()) {

  6.       prm.abortPostBack();

  7.     }

  8. }

  9. prm.add_initializeRequest(InitializeRequest);

  10. prm.add_endRequest(EndRequest);

  11. var postBackElement;

  12. function InitializeRequest(sender, args) {

  13.     if (prm.get_isInAsyncPostBack()) {

  14.         args.set_cancel(true);
  15.     }

  16.     postBackElement = args.get_postBackElement();

  17.     if (postBackElement.id = 'Panel1Trigger') {

  18.         $get('UpdateProgress1').style.display = 'block';               

  19.     }

  20. }

  21. function EndRequest(sender, args) {

  22.     if (postBackElement.id = 'Panel1Trigger') {

  23.         $get('UpdateProgress1').style.display = 'none';

  24.     }

  25. }

  26. // -->

  27. </script>
复制代码
10.保存并按Ctrl + F5运行。
11.单击Trigger按钮,如下所示:

UPTutorial11Step5.jpg
 楼主| 无处不在 发表于 2010-5-13 11:35 | 显示全部楼层
ASP.NET AJAX入门系列(8):自定义异常处理

在UpdatePanel控件异步更新时,如果有错误发生,默认情况下会弹出一个Alert对话框显示出错误信息,这对用户来说是不友好的,本文看一下如何在服务端和客户端脚本中自定义异常处理,翻译自官方文档。


主要内容
1.在服务端自定义异常处理
2.在客户端脚本中自定义异常处理

一.在服务端自定义异常处理
1.添加ASPX页面并切换到设计视图。
2.在工具箱中AJAX Extensions标签下双击ScriptManager和UpdatePanel控件添加到页面中。
3.在UpdatePanel控件中添加两个TextBox,一个Label,一个Button和一些文字,并设置Button的Text属性值为“Calculate”。
UpdatePanelTutorial12Step1.jpg

4.双击Calculate按钮并添加如下代码到事件处理中。

  1. protected void Button1_Click(object sender, EventArgs e)
  2. {
  3.     try
  4.     {
  5.         int a = Int32.Parse(TextBox1.Text);

  6.         int b = Int32.Parse(TextBox2.Text);

  7.         int res = a / b;

  8.         Label1.Text = res.ToString();
  9.     }

  10.     catch (Exception ex)
  11.     {
  12.         if (TextBox1.Text.Length > 0 && TextBox2.Text.Length > 0)
  13.         {
  14.             ex.Data["ExtraInfo"] = " You can't divide " +

  15.                 TextBox1.Text + " by " + TextBox2.Text + ".";

  16.         }
  17.         throw ex;
  18.     }
  19. }
复制代码
在事件处理代码中包含了一个try-catch语句块,在try中进行除法运算,如果运算失败,在catch中设置ExtraInfo信息并重新抛出异常。
5.切换到设计视图并选择ScriptManager控件。
6.在属性窗口中的工具栏中,选择事件按钮,并双击AsyncPostBackError。
UpdatePanelTutorial12Step2.jpg

7.添加如下代码到AsyncPostBackError事件处理。

  1. protected void ScriptManager1_AsyncPostBackError(object sender, AsyncPostBackErrorEventArgs e)
  2. {
  3.     if (e.Exception.Data["ExtraInfo"] != null)
  4.     {
  5.         ScriptManager1. AsyncPostBackErrorMessage =

  6.             e.Exception.Message +

  7.             e.Exception.Data["ExtraInfo"].ToString();

  8.     }
  9.     else
  10.     {       ScriptManager1.AsyncPostBackErrorMessage =

  11.             "An unspecified error occurred.";
  12.     }
  13. }
复制代码
检测异常的ExtraInfo是否为空,并设置为ScriptManager控件的AsyncPostBackErrorMessage,如果不设置则会创建一个默认的异常。
8.保存并按Ctrl + F5运行。
9.在每一个文本框中输入大于零的数,并单击Calculate按钮提交成功。
10.在第二个文本框中输入0,单击Calculate将会引发一个异常。浏览器将会显示一个对话框,提示的信息为我们在服务端设置的信息。
UpdatePanelTutorial12Step3.jpg

二.在客户端脚本中自定义异常处理
前面的异常处理是在服务端通过设置ScriptManager控件的属性来进行处理,下面将看一下如何在客户端脚本中使用PageRequestManager类来进行异常处理,并用<div>元素来代替浏览器默认的Alert对话框。
1.在我们前面创建的页面中,切换到代码视图。
2.添加如下的HTML元素到页面中(官方文档中有点错误)

  1. <div id="AlertDiv" language="javascript" onclick="return AlertDiv_onclick()">

  2.     <div id="AlertMessage">

  3.     </div>

  4.     <br />

  5.     <div id="AlertButtons">

  6.         <input id="OKButton" type="button" value="OK" runat="server" onclick="ClearErrorState()" />

  7.     </div>

  8. </div>
复制代码
3.在HEAD元素中添加如下样式标记。

  1. <style type="text/css">

  2.     #UpdatePanel1 {}{

  3.       width: 200px; height: 50px;

  4.       border: solid 1px gray;

  5.     }

  6.     #AlertDiv{}{

  7.     left: 40%; top: 40%;

  8.     position: absolute; width: 200px;

  9.     padding: 12px;

  10.     border: #000000 1px solid;

  11.     background-color: white;

  12.     text-align: left;

  13.     visibility: hidden;

  14.     z-index: 99;

  15.     }

  16.     #AlertButtons{}{

  17.     position: absolute; right: 5%; bottom: 5%;

  18.     }

  19. </style>
复制代码
4.切换到设计视图并确保你的页面如下所示。
UpdatePanelTutorial13Step1.jpg

5.在属性窗口中的下拉列表中选择DOCUMENT元素(它对应的是页面<Body>元素),设置Id属性值为bodytag。
UpdatePanelTutorial13Step2.jpg

6.切换到代码视图。
7.添加如下<script>代码块。

  1. <script type="text/javascript" language="javascript">

  2. var divElem = 'AlertDiv';

  3. var messageElem = 'AlertMessage';

  4. var bodyTag = 'bodytag';

  5. Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);

  6. function ToggleAlertDiv(visString)

  7. {

  8.      if (visString == 'hidden')

  9.      {

  10.          $get(bodyTag).style.backgroundColor = 'white';                        

  11.      }

  12.      else

  13.      {

  14.          $get(bodyTag).style.backgroundColor = 'gray';                        



  15.      }

  16.      var adiv = $get(divElem);

  17.      adiv.style.visibility = visString;



  18. }

  19. function ClearErrorState() {

  20.      $get(messageElem).innerHTML = '';

  21.      ToggleAlertDiv('hidden');                     

  22. }

  23. function EndRequestHandler(sender, args)

  24. {

  25.    if (args.get_error() != undefined)

  26.    {

  27.        var errorMessage;

  28.        if (args.get_response().get_statusCode() == '200')

  29.        {

  30.            errorMessage = args.get_error().message;

  31.        }

  32.        else

  33.        {

  34.            // Error occurred somewhere other than the server page.

  35.            errorMessage = 'An unspecified error occurred. ';

  36.        }

  37.        args.set_errorHandled(true);

  38.        ToggleAlertDiv('visible');

  39.        $get(messageElem).innerHTML = errorMessage;

  40.    }

  41. }

  42. </script>
复制代码
在代码块中,主要做以下几件事:
1)定义PageRequestManager类的endRequest事件处理,在事件处理中,当有错误发生时将显示AlertDiv。
2)定义ToggleAlertDiv函数,当有错误发生时它用来显示或者隐藏AlertDiv元素,并且改变页面的背景颜色。
3)定义ClearErrorState函数,它用来隐藏错误信息的UI。
8.保存并按Ctrl + F5运行。
9.在每一个文本框中输入大于零的数,并单击Calculate按钮提交成功。
10.在第二个文本框中输入0,单击Calculate将会引发一个异常。这时自定义的AlertDiv将会显示出来代替了默认的Alert对话框,如下图所示:

UpdatePanelTutorial13Step3.jpg
 楼主| 无处不在 发表于 2010-5-13 11:41 | 显示全部楼层
ASP.NET AJAX入门系列(9):在母版页中使用UpdatePanel

本文简单介绍一下在母版页中使用UpdatePanel控件,翻译自官方文档。


主要内容
1.添加UpdatePanel控件到Content Page

2.通过Master Page刷新UpdatePanel



一.添加UpdatePanel控件到Content-Page

1.添加一个新的Master Page,并切换到设计视图。
2.在工具箱中AJAX Extensions标签下双击ScriptManager控件添加到页面中,确保ScriptManager控件添加在ContentPlaceHolder控件之外。
3.在ContentPlaceHolder控件添加文本“Master Page”。
4.在工具箱的HTML标签下,拖动Horizontal Rule(横线)到文本之后,页面如下:
ASPNETAJAX_018.gif

5.创建一个Content Page,选择它的Master Page为我们刚才创建的页面。
在解决方案管理器中点击右键,并选择Add New Item菜单命令,在Add New Item对话框中选择Select master page复选矿,并单击OK按钮。
6.在Content页面中的Content控件中输入Content Page,并添加一个UpdatePanel控件。
ASPNETAJAX_019.gif

7.在UpdatePanel控件中添加Calendar控件。
ASPNETAJAX_020.gif

8.保存并按Ctrl + F5运行。
9.单击Calendar控件中的上月和下月按钮,页面并没有整页刷新。
二.通过Master Page刷新UpdatePanel

在该例子中我们将在Master Page中添加一些控件,它们将引发一个异步提交,同时在Content页面中刷新UpdatePanel。
1.在Master Page中切换到设计视图。
2.添加一些文本和两个按钮到页面中,设置一个按钮的ID属性和Text属性分别为DecrementButton和“-”,设置另一个按钮的ID属性和Text属性分别为IncrementButton和“+”。
ASPNETAJAX_021.gif

3.选择+按钮,在属性窗口的Click事件框中输入MasterButton_Click,对-按钮再重复做一次。
ASPNETAJAX_022.gif

4.在控件之外双击页面添加Page_Load事件处理。
5.在Page_Load事件处理中添加如下代码,注册两个按钮为异步提交按钮。

  1. protected void Page_Load(object sender, EventArgs e)

  2. {
  3.     ScriptManager1.RegisterAsyncPostBackControl(DecrementButton);

  4.     ScriptManager1.RegisterAsyncPostBackControl(IncrementButton);

  5. }
复制代码
6.添加如下代码创建一个MasterButton_Click事件处理。

  1. protected void MasterButton_Click(object sender, EventArgs e)
  2. {
  3.     switch (((Control)sender).ID)
  4.     {
  5.         case "IncrementButton":

  6.             this.Offset = this.Offset + 1;

  7.             break;

  8.         case "DecrementButton":

  9.             this.Offset = this.Offset - 1;

  10.             break;
  11.     }

  12.     ((UpdatePanel)ContentPlaceHolder1.FindControl("UpdatePanel1")).Update();

  13.     Calendar cal = ((Calendar)ContentPlaceHolder1.FindControl("Calendar1"));

  14.     DateTime newDateTime = DateTime.Today.Add(new TimeSpan(Offset, 0, 0, 0));

  15.     cal.SelectedDate = newDateTime;

  16. }
复制代码
7.在Master Page中创建一个公有的属性Offset,来显示所选择的日期和当天之差。

  1. public Int32 Offset
  2. {
  3.     get
  4.     { return (Int32)(ViewState["Offset"] ?? 0); }

  5.     set
  6.     { ViewState["Offset"] = value; }
  7. }
复制代码
8.在Content Page中,切换到设计视图并双击Calendar控件添加一个SelectionChanged事件处理,当用户选择日期时设置Offset属性。
9.添加如下代码到SelectionChanged事件处理中。

  1. protected void Calendar1_SelectionChanged(object sender,EventArgs e)
  2. {
  3.     DateTime selectedDate = Calendar1.SelectedDate;

  4.     Master.Offset =

  5.        ((TimeSpan)Calendar1.SelectedDate.Subtract(

  6.        DateTime.Today)).Days;
  7. }
复制代码
10.在Content Page页面的Page_Load事件中添加如下代码。

  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3.     DateTime newDateTime =

  4.         DateTime.Today.Add(new

  5.         TimeSpan(Master.Offset, 0, 0, 0));

  6.     Calendar1.SelectedDate = newDateTime;
  7. }
复制代码
11.添加@ MasterType标记到页面中,以便可以作为强类型属性引用Master Page页面的Offset属性。
<%@ MasterType VirtualPath="MasterPage.master" %>
12.在Content Page中切换到设计视图,并选择UpdatePanel控件。
13.在属性窗口中设置UpdateMode为Conditional。
ASPNETAJAX_023.gif

14.保存并按Ctrl + F5运行。
15.在Calendar控件中单击上一月和下一月按钮,可以看到整页刷新。
16.选择一个日期并单击Master Page中的按钮,可以看到仍然没有整页刷新。
 楼主| 无处不在 发表于 2010-5-13 11:48 | 显示全部楼层
ASP.NET AJAX入门系列(10):Timer控件简单使用

本文主要通过一个简单示例,让Web页面在一定的时间间隔内局部刷新,来学习一下ASP.NET AJAX中的服务端Timer控件的简单使用。

主要内容
    Timer控件的简单使用

1.添加新页面并切换到设计视图。
2.如果页面没有包含ScriptManager控件,在工具箱的AJAX Extensions标签下双击ScriptManager控件添加到页面中。
TimerControlTutorial1Step1.jpg
3.单击ScriptManager控件并双击UpdatePanel控件添加到页面中。
TimerControlTutorial1Step2.jpg
4.在UpdatePanel控件内单击并双击Timer控件添加到UpdatePanel中。Timer控件可以作为UpdatePanel的触发器不管是否在UpdatePanel中。
TimerControlTutorial1Step3.jpg
5.设置Interval属性为10000。Interval属性的单位是毫秒,所以我们设置为10000,相当于10秒钟刷新一次。
6.在UpdatePanel控件中添加一个Label控件。
TimerControlTutorial1Step4.jpg
7.设置Label控件的Text属性为“Panel not refreshed yet  ”。确保Label控件添加在了UpdatePanel控件里面。
8.在UpdatePanel之外再添加一个Label控件。确保第二个Label控件在UpdatePanel的外面。
TimerControlTutorial1Step5.jpg
9.双击Timer控件添加Tick事件处理,在事件处理中设置Label1的Text属性为当前时间。.在Page_Load事件中添加代码设置Label2的Text属性为页面创建时间,如下代码所示:.切换到代码视图,确保代码如下所示:.保存并按Ctrl + F5运行
  1. protected void Timer1_Tick(object sender, EventArgs e)

  2. {
  3.     Label1.Text = "Panel refreshed at: " +

  4.       DateTime.Now.ToLongTimeString();
  5. }
复制代码
10

  1. protected void Page_Load(object sender, EventArgs e)

  2. {
  3.     Label2.Text = "Page created at: " +

  4.       DateTime.Now.ToLongTimeString();
  5. }
复制代码
11

  1. protected void Page_Load(object sender, EventArgs e)
  2. {
  3.     Label2.Text = "Page created at: " +

  4.       DateTime.Now.ToLongTimeString();
  5. }

  6. protected void Timer1_Tick(object sender, EventArgs e)

  7. {
  8.     Label1.Text = "Panel refreshed at: " +

  9.       DateTime.Now.ToLongTimeString();
  10. }
复制代码
12

13.等待10秒钟后可以看到Panel刷新,里面的Label文字改变为刷新的时间而外面的Label没有改变。
 楼主| 无处不在 发表于 2010-5-13 12:20 | 显示全部楼层
ASP.NET AJAX入门系列(11):在多个UpdatePanle中使用Timer

本文将使用Timer控件更新两个UpdatePanel控件,Timer控件将放在UpdatePanel控件的外面,并将它配置为UpdatePanel的触发器,翻译自官方文档。

主要内容
    在多个UpdatePanel中使用Timer控件

1.添加一个新页面并切换到设计视图。
2.如果页面没有包含ScriptManager控件,在工具箱中的AJAX Extensions标签下双击ScriptManager控件添加到页面中。

3.双击Timer控件添加到Web页面中。Timer控件可以作为UpdatePanel的触发器不管它是否在UpdatePanel中。

4.双击UpdatePanel控件添加一个Panel到页面中,并设置它的UpdateMode属性值为Conditional。

5.再次双击UpdatePanel控件添加第二个Panel到页面中,并设置它的UpdateMode属性值为Conditional。

6.在UpdatePanel1中单击,并在工具箱中Standard标签下双击Label控件添加到UpdatePanel1中。
7.设置Label控件的Text属性值为“UpdatePanel1 not refreshed yet”。

8.添加Label控件到UpdatePanel2。
9.设置第二个Label控件的Text属性值为“UpdatePanel2 not refreshed yet”。


10.设置Interval属性为10000。Interval属性的单位是毫秒,所以我们设置为10000,相当于10秒钟刷新一次。
11.双击Timer控件添加Tick事件处理,在事件处理中设置Label1和Label2的Text属性值,代码如下。.在UpdatePanel1和UpdatePanel2中添加Timer控件作为AsyncPostBackTrigger,代码如下:

public partial class _Default : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

    }

    protected void Timer1_Tick(object sender, EventArgs e)

    {

        Label1.Text = "UpdatePanel1 refreshed at: " +

          DateTime.Now.ToLongTimeString();

        Label2.Text = "UpdatePanel2 refreshed at: " +

          DateTime.Now.ToLongTimeString();

    }

}12

<Triggers>

  <asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />

</Triggers>全部完成后ASPX页面代码如下:
.保存并按Ctrl + F5运行。
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head id="Head1" runat="server">

    <title>Untitled Page</title>

</head>

<body>

    <form id="form1" runat="server">

        <asp:ScriptManager ID="ScriptManager1" runat="server" />

        <div>

            <asp:Timer ID="Timer1" OnTick="Timer1_Tick" runat="server" Interval="10000">

            </asp:Timer>

        </div>

        <asp:UpdatePanel ID="UpdatePanel1" UpdateMode="Conditional" runat="server">

            <Triggers>

                <asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />

            </Triggers>

            <ContentTemplate>

                <aspabel ID="Label1" runat="server" Text="UpdatePanel1 not refreshed yet."></aspabel>

            </ContentTemplate>

        </asp:UpdatePanel>

        <asp:UpdatePanel ID="UpdatePanel2" UpdateMode="Conditional" runat="server">

            <Triggers>

                <asp:AsyncPostBackTrigger ControlID="Timer1" EventName="Tick" />

            </Triggers>

            <ContentTemplate>

                <aspabel ID="Label2" runat="server" Text="UpdatePanel2 not refreshed yet."></aspabel>

            </ContentTemplate>

        </asp:UpdatePanel>



    </form>

</body>

</html>
13

14.等待10秒钟后两个UpdatePanel都刷新后,Label中的文本都变成了当前时间。
有烟没火 发表于 2011-7-25 10:52 | 显示全部楼层
看,刚说你眼神不好,你还就来劲了不是.
走就走吧 发表于 2011-8-4 12:18 | 显示全部楼层
谢谢楼主,好久没看到这么好的贴了
曾经的小孩 发表于 2011-8-16 10:44 | 显示全部楼层
支持一下吧
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-4-25 20:50 , Processed in 0.216006 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表