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

原创 2011年01月24日 11:31:00

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:.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属性。


<%@ 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属性都很简单。

【ASP.NET】利用UpdatePanel与ScriptManager完成局部的更新

ASP.NET中不仅可以像其它网页一样通过《【ASP.NET】利用jQuery与.ashx完成简单的Ajax》(点击打开链接)完成简单的局部更新, 在ASP.NET2.0版本(不含)之后,基本上在其...
  • yongh701
  • yongh701
  • 2016年01月08日 15:33
  • 2702

ASP.NET AJAX 控件使用概述

一、ASP.NET AJAX 控件概述 借助 ASP.NET AJAX 控件,使用很少的客户端脚本或不使用客户端脚本就能创建丰富的客户端行为,如在异步回发过程中进行部分页更新(在回发时刷新网页的选定...
  • qustdjx
  • qustdjx
  • 2013年12月22日 20:44
  • 1721

ASP.NET—015:ASP.NET中无刷新页面实现

前面也说过在asp.net中前后前交互的问题。使用了ajax.js的方法:$.post和$.ajax。http://blog.csdn.net/yysyangyangyangshan/article/...
  • yysyangyangyangshan
  • yysyangyangyangshan
  • 2014年09月30日 00:18
  • 7131

asp.net控件库FineUI使用入门图解

FineUI是一个基于 jQuery / ExtJS 的 ASP.NET 控件库,其宣传语是: 创建 No JavaScript,No CSS,No UpdatePanel,No ViewState...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年04月17日 17:01
  • 2792

结合个人经历总结的前端入门方法(这才是真的入门经典)

http://blog.csdn.net/u014326381/article/details/50176339 结合个人经历总结的前端入门方法,总结从零基础到具...
  • lhq186
  • lhq186
  • 2017年06月16日 10:27
  • 430

ajax刷新ASP.NET Repeater控件的数据

使用repeater控件时,遇到这样一个问题,
  • u010371458
  • u010371458
  • 2014年01月25日 16:27
  • 1683

【ASP.NET】利用UpdatePanel、ScriptManager、Timer完成定时局部更新

在《【ASP.NET】利用UpdatePanel与ScriptManager完成局部的更新》(点击打开链接)介绍过如果直接利用C#完成javascript中Ajax的局部更新。 其实在ASP.NET...
  • yongh701
  • yongh701
  • 2016年01月08日 16:44
  • 2109

SpringBoot入门系列:第二篇 再学Hello World

Spring-Boot是Spring的新东东,为了让人尽快的使用,它提供了一个非常好的辅助工具,直接为我们生成Maven架构的工程。下面,我们通过helloworld看 一、在浏览器中打开http:...
  • lxhjh
  • lxhjh
  • 2016年06月24日 13:25
  • 26929

ASP.Net中menu控件使用

为了使用方便asp.net中提供了两类控件html控件与用户控件。这里不在详细介绍。menu属于用户控件。 menu最重要的是item属性,item包含了menu控件要显示的类表,几级菜单神马的,点...
  • jianxia_wzx
  • jianxia_wzx
  • 2013年05月22日 09:51
  • 3556

ASP.NET初了解(一)--Html控件和Web控件

作为一名ASP.NET的初学者,了解并且区别一些混淆概念是很必须的,今天这篇博文就是主要向大家介绍一下Html控件和Web控件。在ASP.NET中,用户界面控件主要就是Html控件和Web控件,在前台...
  • sunliduan
  • sunliduan
  • 2013年12月18日 19:19
  • 4806
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET AJAX入门系列(2):使用ScriptManager控件
举报原因:
原因补充:

(最多只允许输入30个字)