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

简介:



ScriptManager控件包括在ASP.NET 2.0 AJAX Extensions中,它用来处理页面上的所有组件以及页面局部更新,生成相关的客户端代理脚本以便能够在JavaScript中访问Web Service,所有需要支持ASP.NET AJAXASP.NET页面上有且只能有一个ScriptManager控件。在ScriptManager控件中我们可以指定需要的脚本库,或者指定通过JS来调用的Web Service,以及调用AuthenticationServiceProfileService,还有页面错误处理等。

 
主要内容
1 .控件概述
2 .一个简单的示例
3 .客户端脚本模式
4 .错误处理
5 Services属性
6 Scripts属性
 
一.控件概述
ScriptManager 控件包括在ASP.NET 2.0 AJAX Extensions中,它用来处理页面上的所有组件以及页面局部更新,生成相关的客户端代理脚本以便能够在JavaScript中访问Web Service,所有需要支持ASP.NET AJAXASP.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发送到客户端的脚本的模式,有四种模式:AutoInheritDebugRelease,默认值为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发送到客户端的脚本的模式,它有四种模式:AutoInheritDebugRelease,默认值为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属性都很简单。










本文转自lihuijun51CTO博客,原文链接:  http://blog.51cto.com/terrylee/67708 ,如需转载请自行联系原作者

相关文章
|
开发框架 JavaScript 前端开发
震撼!破解 ASP.NET 服务器控件 Button 执行顺序之谜,颠覆你的开发认知!
【8月更文挑战第16天】在ASP.NET开发中,通过Button控件实现先执行JavaScript再触后台处理的需求十分常见。例如,在用户点击按钮前需前端验证或提示,确保操作无误后再传递数据至后台深度处理。此过程可通过设置Button的`OnClientClick`属性调用自定义JavaScript函数完成验证;若验证通过,则继续触发后台事件。此外,结合jQuery也能达到相同效果,利用`__doPostBack`手动触发服务器端事件。这种方式增强了应用的交互性和用户体验。
251 8
|
前端开发 JavaScript 安全
入门Vue+.NET 8 Web Api记录(一)
入门Vue+.NET 8 Web Api记录(一)
814 5
|
开发框架 前端开发 JavaScript
ASP.NET AJAX使用方法概述(三)
ASP.NET AJAX使用方法概述(三)
218 1
|
XML 前端开发 JavaScript
Ajax与Axios,以及Apifox的入门使用
本文由blue编写于2025年3月20日,主要介绍了Ajax、Axios以及Apifox的入门使用。文章首先讲解了Ajax的概念与作用,通过原生代码示例展示了如何实现异步数据交互;接着引入Axios,说明其对Ajax的封装简化了开发流程,并给出Axios实现相同功能的代码;最后详细讲述了Apifox的基本用法,包括创建接口、设置参数及生成Mock数据,为前后端开发提供了便利工具。
399 0
|
开发框架 缓存 .NET
GraphQL 与 ASP.NET Core 集成:从入门到精通
本文详细介绍了如何在ASP.NET Core中集成GraphQL,包括安装必要的NuGet包、创建GraphQL Schema、配置GraphQL服务等步骤。同时,文章还探讨了常见问题及其解决方法,如处理复杂查询、错误处理、性能优化和实现认证授权等,旨在帮助开发者构建灵活且高效的API。
439 3
|
存储 消息中间件 NoSQL
Redis 入门 - C#.NET Core客户端库六种选择
Redis 入门 - C#.NET Core客户端库六种选择
1025 8
|
SQL XML 关系型数据库
入门指南:利用NHibernate简化.NET应用程序的数据访问
【10月更文挑战第13天】NHibernate是一个面向.NET的开源对象关系映射(ORM)工具,它提供了从数据库表到应用程序中的对象之间的映射。通过使用NHibernate,开发者可以专注于业务逻辑和领域模型的设计,而无需直接编写复杂的SQL语句来处理数据持久化问题。NHibernate支持多种数据库,并且具有高度的灵活性和可扩展性。
466 2
|
程序员 C# 图形学
全面的C#/.NET自学入门指南
全面的C#/.NET自学入门指南
411 0
|
SQL 关系型数据库 数据库
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
409 2
下一篇
开通oss服务