ASP.NET AJAX入门系列(2):使用ScriptManager控件

本文详细介绍了 ASP.NET AJAX Extensions 中的核心控件 ScriptManager 的功能与使用方法,包括其在页面局部更新、客户端脚本处理、错误处理等方面的应用,并提供了具体的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:http://www.cnblogs.com/Terrylee/archive/2006/10/25/ASPNET_AJAX_ScriptManager.html

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定义形式:

 

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

      
< AuthenticationService  Path =""   />

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

      
< Scripts >

        
< asp:ScriptReference />

      
</ Scripts >

      
< Services >

        
< asp:ServiceReference  />

      
</ Services >

</ 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示例,在页面中加入了日期控件和一个下拉框,根据下拉框选择的不同,日期控件背景变为不同的颜色。示例代码如下:
<% @ Page Language = " C# "  AutoEventWireup = " true "  CodeFile = " Default.aspx.cs "  Inherits = " _Default "   %>

< script  runat ="server" >
    
void  DropDownSelection_Change(Object sender, EventArgs e)
    {
        Calendar1.DayStyle.BackColor 
=   System.Drawing.Color.FromName(ColorList.SelectedItem.Value);
    }
</ script >

< html  xmlns ="http://www.w3.org/1999/xhtml" >
< head  id ="Head1"  runat ="server" >
    
< title > ScriptManager Example </ title >
</ head >
< body >
    
< form  id ="form1"  runat ="server" >
        
< div >
            
< asp:ScriptManager  ID ="ScriptManager1"    runat ="server" >
            
</ asp:ScriptManager >
            
< asp:UpdatePanel  ID ="UpdatePanel1"    runat ="server" >
                
< ContentTemplate >
                    
< asp:Calendar  ID ="Calendar1"    ShowTitle ="True"    runat ="server"   />
                    
< div >
                        Background:
                        
< br  />
                        
< asp:DropDownList  ID ="ColorList"    AutoPostBack ="True"   OnSelectedIndexChanged ="DropDownSelection_Change"    runat ="server" >
                            
< asp:ListItem  Selected ="True"  Value ="White" >  
                            White 
</ asp:ListItem >
                            
< asp:ListItem  Value ="Silver" >  
                            Silver 
</ asp:ListItem >
                            
< asp:ListItem  Value ="DarkGray" >  
                            Dark Gray 
</ asp:ListItem >
                            
< asp:ListItem  Value ="Khaki" >  
                            Khaki 
</ asp:ListItem >
                            
< asp:ListItem  Value ="DarkKhaki" >  D
                            ark Khaki 
</ asp:ListItem >
                        
</ asp:DropDownList >
                    
</ div >
                
</ ContentTemplate >
            
</ asp:UpdatePanel >
            
< br  />
        
</ div >
    
</ form >
</ body >
</ html >
三.客户端脚本模式
在前面我们提到了ScriptMode属性指定ScriptManager发送到客户端的脚本的模式,它有四种模式:Auto,Inherit,Debug,Release,默认值为Auto。
1 .Auto:它会根据Web站点的Web.config配置文件来决定使用哪一种模式,只有当配置文件中retail属性设置为false:
< 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 .Inherit:应该是通过程序设置ScriptMode的时候,等同于Auto?(不太了解)
3 .Debug:客户端脚本使用Debug版本,除非retail属性设为true。
4 .Release:客户端脚本使用Release版本,除非retail属性设为false。
 
四.错误处理
在页面回传时如果发生了异常AsyncPostBackError事件将被触发,错误信息的处理依赖于AllowCustomErrors属性、AsyncPostBackErrorMessage属性和Web.config中的<customErrors>配置区。下面看一个简单的错误处理例子,在AsyncPostBackError事件中捕获到异常信息并设置AsyncPostBackErrorMessage属性。
<% @ Page Language = " C# "   %>
< script  runat ="server" >
    protected 
void  ErrorProcessClick_Handler(object sender, EventArgs e)
    {
        
//  This handler demonstrates an error condition. In this example
         //  the server error gets intercepted on the client and an alert is shown. 
         throw   new  ArgumentException();
    }

    protected 
void  SuccessProcessClick_Handler(object sender, EventArgs e)
    {
        
//  This handler demonstrates no server side exception.
        UpdatePanelMessage.Text  =   " The asynchronous postback completed successfully. " ;
    }

    protected 
void  ScriptManager1_AsyncPostBackError(object sender, AsyncPostBackErrorEventArgs e)
    {
        ScriptManager1.AsyncPostBackErrorMessage 
=   " 异常信息为: "   +  e.Exception.Message;
    }

</ script >

< html  xmlns ="http://www.w3.org/1999/xhtml" >
< head  id ="Head1"  runat ="server" >
    
< title > PageRequestManager endRequestEventArgs Example </ title >
    
< style  type ="text/css" >
    body 
{}{
        font-family
:  Tahoma ;
    
}
    #AlertDiv
{}{
    left
:  40% ;  top :  40% ;
    position
:  absolute ;  width :  200px ;
    padding
:  12px ;  
    border
:  #000000 1px solid ;
    background-color
:  white ;  
    text-align
:  left ;
    visibility
:  hidden ;
    z-index
:  99 ;
    
}

    #AlertButtons
{}{
    position
:  absolute ;
    right
:  5% ;
    bottom
:  5% ;
    
}

    
</ style >
</ head >
< body  id ="bodytag" >
    
< form  id ="form1"  runat ="server" >
        
< div >
            
< asp:ScriptManager  ID ="ScriptManager1"  runat ="server"  
            OnAsyncPostBackError
="ScriptManager1_AsyncPostBackError" >

            
</ asp:ScriptManager >
            
< script  type ="text/javascript"  language ="javascript" >
                
var  divElem  =   ' AlertDiv ' ;
                
var  messageElem  =   ' AlertMessage ' ;
                
var  errorMessageAdditional  =   ' Please try again. ' ;
                
var  bodyTag  =   ' bodytag ' ;
                Sys.WebForms.PageRequestManager.getInstance().add_endRequest(EndRequestHandler);
                
function  ToggleAlertDiv(visString)
                {
                     
if  (visString  ==   ' hidden ' )
                     {
                         $get(bodyTag).style.backgroundColor 
=   ' white ' ;                         
                     }
                     
else
                     {
                         $get(bodyTag).style.backgroundColor 
=   ' gray ' ;                         
                     }
                     
var  adiv  =  $get(divElem);
                     adiv.style.visibility 
=  visString;
                }

                
function  ClearErrorState() {
                     $get(messageElem).innerHTML 
=   '' ;
                     ToggleAlertDiv(
' hidden ' );                     
                }
                
function  EndRequestHandler(sender, args)
                {
                   
if  (args.get_error()  !=  undefined  &&  args.get_error().httpStatusCode  ==   ' 500 ' )
                   {
                       
var  errorMessage  =  args.get_error().message
                       args.set_errorHandled(
true );
                       ToggleAlertDiv(
' visible ' );
                       $get(messageElem).innerHTML 
=   ' " '   +  
                                errorMessage 
+   ' '   +  errorMessageAdditional;
                   }
                }

            
</ script >
            
< asp:UpdatePanel  runat ="Server"  UpdateMode ="Conditional"  ID ="UpdatePanel1" >
                
< ContentTemplate >
                    
< asp:Panel  ID ="Panel1"  runat ="server"  GroupingText ="Update Panel" >
                        
< asp:Label  ID ="UpdatePanelMessage"  runat ="server"   />
                        
< br  />
                        Last update:
                        
<% =  DateTime.Now.ToString()  %>
                        .
                        
< br  />
                        
< asp:Button  runat ="server"  ID ="Button1"  Text ="Submit Successful Async Postback"
                            OnClick
="SuccessProcessClick_Handler"  OnClientClick ="ClearErrorState()"   />
                        
< asp:Button  runat ="server"  ID ="Button2"  Text ="Submit Async Postback With Error"
                            OnClick
="ErrorProcessClick_Handler"  OnClientClick ="ClearErrorState()"   />
                        
< br  />
                    
</ asp:Panel >
                
</ ContentTemplate >
            
</ asp:UpdatePanel >
            
< div  id ="AlertDiv" >
                
< div  id ="AlertMessage" >
                
</ div >
                
< br  />
                
< div  id ="AlertButtons"   >
                    
< input  id ="OKButton"  type ="button"  value ="OK"  
                           runat
="server"  onclick ="ClearErrorState()"   />
                
</ div >
           
</ div >
    
</ form >
</ body >
</ html >

 

运行后时界面:
发生异常信息:
 
五.Services属性
Services 用来管理对WebService的调用,通过<asp:ServiceReference>标签可以在Services中注册一个WebService,在运行时ScriptManager将为每一个ServiceReference对象生成一个客户端代理,<asp:ServiceReference>标签一个很重要的属性是Path,用来指定WebService的路径,如下所示:
< asp:ScriptManager  ID ="SM1"  runat ="server" >
    
< Services >
        
< asp:ServiceReference  Path ="Service.asmx" />
    
</ Services >
</ asp:ScriptManager >
看一个简单的调用WebService的例子:
WebService 如下,注意在WebServiceSample上加ScriptService特性:
[ScriptService]
public   class  WebServiceSample : System.Web.Services.WebService {
    
public  WebServiceSample()
    {
        
// Uncomment the following line if using designed components 
        
// InitializeComponent(); 
    }

    [WebMethod]
    
public   string  EchoString(String s)
    {
        
return   " Hello  "   +  s;
    }
}
ASPX 页面:
<% @ Page Language = " C# "  AutoEventWireup = " true "  CodeFile = " Default3.aspx.cs "  Inherits = " Default3 "   %>
< html  xmlns ="http://www.w3.org/1999/xhtml"   >
< head  runat ="server" >
    
< title > Untitled Page </ title >
</ head >
< script  type ="text/javascript"  language ="JavaScript" >
    
function  OnbuttonGo_click() 
    {
        requestSimpleService 
=  WebServiceSample.EchoString(
            document.getElementById(
' inputName ' ).value,        // params
            OnRequestComplete     // Complete event
            );
        
return   false ;
    }
    
function  OnRequestComplete(result) 
    {
        alert(result);
    }
</ script >

< body >
    
< form  id ="form1"  runat ="server" >
    
< asp:ScriptManager  ID ="ScriptManager1"  runat ="server" >
        
< Services >
            
< asp:ServiceReference  Path ="WebServiceSample.asmx" />
        
</ Services >
    
</ asp:ScriptManager >
    
< div >
        
< input  type ="text"  id ="inputName"  size =20 />
        
< input  id ="button"  type ="button"  value ="调 用"  onclick ="return OnbuttonGo_click()"   /></ div >
    
</ form >
</ body >
</ html >
运行后效果如下:
当然了也可以在运行时动态的在Services中加入ServiceReference,下面看一个运行时动态加入ServiceReference的例子:
<% @ Page Language = " C# "  AutoEventWireup = " true "  CodeFile = " Default3.aspx.cs "  Inherits = " Default3 "   %>

< script  runat ="server" >
    
void  Page_Load(object sender, EventArgs e)
    {
        ServiceReference sr 
=   new  ServiceReference();
        sr.Path 
=   " WebServiceSample.asmx " ;
        ScriptManager1.Services.Add(sr);
    }
</ script >

< html  xmlns ="http://www.w3.org/1999/xhtml"   >
< head  runat ="server" >
    
< title > Untitled Page </ title >
</ head >

< script  type ="text/javascript"  language ="JavaScript" >
    
function  OnbuttonGo_click() 
    {
        requestSimpleService 
=  WebServiceSample.EchoString(
            document.getElementById(
' inputName ' ).value,        // params
            OnRequestComplete     // Complete event
            );
        
return   false ;
    }
    
function  OnRequestComplete(result) 
    {
        alert(result);
    }
</ script >

< body >
     
< form  id ="form1"  runat ="server" >
    
< asp:ScriptManager  ID ="ScriptManager1"  runat ="server" >
    
</ asp:ScriptManager >
    
< div >
        
< input  type ="text"  id ="inputName"  size =20 />
        
< input  id ="button"  type ="button"  value ="调 用"  onclick ="return OnbuttonGo_click()"   /></ div >
    
</ form >
</ body >
</ html >
可以看到运行后和在ScriptManager中直接加入的效果是一样的。
 
六.Scripts属性
关于Scripts属性到后面具体再说吧,最主要的属性有Path指定脚本的路径,ScriptMode指定客户端脚本的模式,它会覆盖ScriptManager中的ScriptMode属性,还有一个属性是IgnoreScriptPath,指定是否忽略掉ScriptManager中的ScriptPath属性。
关于ScriptManager控件就学习到这里了,至于AuthenticationService属性和ProfileService属性都很简单。

示例代码下载:http://www.cnblogs.com/Files/Terrylee/ASPNETAJAXScriptManagerDemo.rar
1 [ScriptService]
要添加 using System.Web.Script.Services;
和System.Web.Extensions引用
2
namespace SM
{
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class AjaxService : System.Web.Services.WebService
{

[WebMethod]
public string HelloWorld(string name)
{
return name + " Hello World";
}
}
}
3 js要把命名空间写上,如下
<script type="text/javascript" language="JavaScript">

function OnbuttonGo_click()
{
SM.AjaxService.HelloWorld(
document.getElementById('inputName').value, //params
OnRequestComplete //Complete event
);
return false;
}
function OnRequestComplete(result)
{
alert(result);
}
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值