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: %; top: %; position: absolute; width: 200px; padding: 12px; border: # 1px solid; background-color: white; text-align: left; visibility: hidden; z-index: ; } #AlertButtons{ position: absolute; right: %; bottom: %; } </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 == '')
{ 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=/> <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=/>

        <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://files.cnblogs.com/Terrylee/ASPNETAJAXScriptManagerDemo.rar

ASP.NET AJAX入门系列(2):使用ScriptManager控件的更多相关文章

  1. ASP.NET AJAX入门系列(4):使用UpdatePanel控件(一)

    UpdatePanel可以用来创建丰富的局部更新Web应用程序,它是ASP.NET 2.0 AJAX Extensions中很重要的一个控件,其强大之处在于不用编写任何客户端脚本,只要在一个页面上添加 ...

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

    经常关注我的Blog的朋友可能注意到了,在我Blog的左边系列文章中,已经移除了对Atlas学习手记系列文章的推荐,因为随着ASP.NET AJAX 1.0 Beta版的发布,它们已经不再适用,为了不 ...

  3. ASP.NET AJAX入门系列

    ASP.NET AJAX入门系列将会写关于ASP.NET AJAX一些控件的使用方法以及基础知识,其中部分文章为原创,也有一些文章是直接翻译自官方文档,本部分内容会不断更新. 目录 ASP.NET A ...

  4. ASP.NET AJAX入门系列(11):在多个UpdatePanle中使用Timer控件

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

  5. ASP.NET AJAX入门系列(10):Timer控件简单使用

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

  6. ASP.NET AJAX入门系列(9):在母版页中使用UpdatePanel

    本文简单介绍一下在母版页中使用UpdatePanel控件,翻译自官方文档. 主要内容 1.添加UpdatePanel控件到Content Page 2.通过Master Page刷新UpdatePan ...

  7. ASP.NET AJAX入门系列(6):UpdateProgress控件简单介绍

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

  8. ASP.NET AJAX入门系列(5):使用UpdatePanel控件(二) UpdatePanel

    UpdatePanel可以用来创建丰富的局部更新Web应用程序,它是ASP.NET 2.0 AJAX Extensions中很重要的一个控件,其强大之处在于不用编写任何客户端脚本,只要在一个页面上添加 ...

  9. ASP.NET AJAX入门系列(3):使用ScriptManagerProxy控件

    在ASP.NET AJAX中,由于一个ASPX页面上只能有一个ScriptManager控件,所以在有母版页的情况下,如果需要在Master-Page和Content-Page中需要引入不同的脚本时, ...

随机推荐

  1. python中单引号,双引号,多引号区别

    先说1双引号与3个双引号的区别,双引号所表示的字符串通常要写成一行如:s1 = "hello,world"如果要写成多行,那么就要使用\ (“连行符”)吧,如s2 = " ...

  2. ViewPager + Fragment实现滑动标签页

    http://blog.csdn.net/lizhenmingdirk/article/details/13631813; tab与frg的区别: http://www.cnblogs.com/tia ...

  3. windows计划任务执行SQLserver脚本

    2016年3月1号,北京出差,documentbrowser系统改善上线. 其中有一个数据库表需要每天进行同步,原计划使用SQLServer的作业来执行又方便又快捷,但是客户的数据库是05的expre ...

  4. HMM:隐马尔科夫模型-前向算法

    http://blog.csdn.net/pipisorry/article/details/50722376 目标-解决HMM的基本问题之一:已知HMM模型λ及观察序列O,如何计算P(O|λ)(计算 ...

  5. myeclipse附加源码进行查看的方法

    在编程过程中,有可能需要用到看源码的情况,那么怎么进行添加源码呢,这里做下记录 首先,先下载javaEE源码(可在网上自由下载) 1.在HttpServlet上右键-->Open Declara ...

  6. Linux(CentOS7)设置自动备份数据库到阿里云OSS

    环境:阿里云服务器CentOS7.4 + MySQL5.6 基本思路: 1.编写shell脚本,备份数据库到指定目录下 2.编写Python脚本,把文件上传到OSS 3.把shell脚本和Python ...

  7. ui-router(三)controller与template

    这篇就是在以前的基础上,把客户端angular.js 负责的部分整体串起来演示一下. 我们按照angular执行顺序来做前提准备: (1)Client 根目录下 index.html 首先加载angu ...

  8. Android 切换主题 (二)

    Android 切换主题 (二) 背景 我原来写过一篇文章关于 android 切换主题的文章 -- Android 切换主题以及换肤的实现 , 里面介绍了如何使用 setTheme() 来切换主题, ...

  9. 21、AngularJs知识点总结 part-3

    1.选择框select 在 AngularJS 中我们可以使用 ng-option 指令来创建一个下拉列表,列表项通过对象和数组循环输出,也可以使用ng-repeat 指令来创建下拉列表: 区别:ng ...

  10. HDU1016 Prime Ring Problem (回溯 + 剪枝)

    本文链接:http://www.cnblogs.com/Ash-ly/p/5398684.html 题意: 给你一个数字N(N <= 20),要求你把这N个数组成一个环,环内的数字不能重复,左右 ...