更新:2007 年 11 月
为 Web 和应用程序服务管理 ASP.NET AJAX 脚本库和脚本文件、部分页面呈现以及客户端代理类生成。
命名空间:
System.Web.UI 程序集:
System.Web.Extensions(在 System.Web.Extensions.dll 中)
<AspNetHostingPermissionAttribute(SecurityAction.InheritanceDemand, Level := AspNetHostingPermissionLevel.Minimal)> _
<AspNetHostingPermissionAttribute(SecurityAction.LinkDemand, Level := AspNetHostingPermissionLevel.Minimal)> _
Public Class ScriptManager _
Inherits Control _
Implements IPostBackDataHandler, IScriptManager
Dim instance As ScriptManager
[AspNetHostingPermissionAttribute(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermissionAttribute(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
public class ScriptManager : Control,
IPostBackDataHandler, IScriptManager
[AspNetHostingPermissionAttribute(SecurityAction::InheritanceDemand, Level = AspNetHostingPermissionLevel::Minimal)]
[AspNetHostingPermissionAttribute(SecurityAction::LinkDemand, Level = AspNetHostingPermissionLevel::Minimal)]
public ref class ScriptManager : public Control,
IPostBackDataHandler, IScriptManager
/** @attribute AspNetHostingPermissionAttribute(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal) */
/** @attribute AspNetHostingPermissionAttribute(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal) */
public class ScriptManager extends Control implements IPostBackDataHandler,
IScriptManager
public class ScriptManager extends Control implements IPostBackDataHandler, IScriptManager
ScriptManager 控件是 ASP.NET 中 AJAX 功能的中心。该控件可管理一个页面上的所有 ASP.NET AJAX 资源。其中包括将 Microsoft AJAX Library 脚本下载到浏览器和协调通过使用 UpdatePanel 控件启用的部分页面更新。此外,通过 ScriptManager 控件,您还能执行以下操作:
注册与部分页面更新兼容的脚本。为了管理您的脚本与核心库之间的依赖项,将在加载 Microsoft AJAX Library 脚本之后加载您注册的所有脚本。
指定是发布还是调试发送到浏览器的脚本。
通过向 ScriptManager 控件注册 Web 服务,提供从脚本访问 Web 服务方法的权限。
通过向 ScriptManager 控件注册 ASP.NET 身份验证、角色和配置文件应用程序服务,提供从客户端脚本访问这些服务的权限。
在浏览器中以区域性特定的形式显示 ECMAScript (JavaScript) 的 Date、Number 和 String 函数。
使用 ScriptReference 控件的 ResourceUICultures 属性来访问嵌入式脚本文件或独立脚本文件的本地化资源。
向 ScriptManager 控件注册可实现 IExtenderControl 或 IScriptControl 接口的服务器控件,以便呈现客户端组件和行为所需的脚本。
部分页面呈现
将 ScriptManager 控件与母版页、用户控件及其他子组件一起使用
脚本管理和注册概述
通过 ScriptManager 控件可注册随后将作为页面一部分呈现的脚本。ScriptManager 控件注册方法可以细分为以下三种类别:
保证维护 Microsoft AJAX Library 上脚本依赖项的注册方法。
不依赖 Microsoft AJAX Library 但与 UpdatePanel 控件兼容的注册方法。
支持与 UpdatePanel 控件协作的注册方法。
有关如何在 ASP.NET 中创建和使用 AJAX 脚本的更多信息,请参见使用 Microsoft AJAX Library 创建自定义客户端脚本。
注册依赖 Microsoft AJAX 库的脚本
可以使用下列方法,以保证维护 Microsoft AJAX Library 上所有依赖项的方式注册脚本文件。
注册部分页面更新兼容脚本
UpdatePanel 控件的注册方法
Web 服务引用
本地化
ScriptManager 控件可在呈现页面中生成指向适当的本地化脚本文件(嵌入程序集中的脚本文件或独立脚本文件)的引用。
在将 EnableScriptLocalization 属性设置为 true 时,ScriptManager 控件会检索当前区域中诸如本地化字符串这样的本地化资源(如果存在)。ScriptManager 控件可为使用本地化资源提供下列功能:
嵌入到程序集中的脚本文件。ScriptManager 控件可确定将哪个区域性特定的或回退区域性脚本文件发送到浏览器。为此,它会使用区域性特定的 NeutralResourcesLanguageAttribute 程序集属性、打包在程序集中的资源以及浏览器的 UI 区域性(如果有)。
独立脚本文件。ScriptManager 控件可使用 ScriptReference 对象的 ResourceUICultures 属性来定义受支持的 UI 区域性的列表。
在调试模式中。ScriptManager 控件试图呈现包含调试信息的区域性特定的脚本文件。例如,如果页面处于调试模式且当前区域性设置为 en-MX,则该控件会呈现一个其名称如 scriptname.en-MX.debug.js 这样的脚本文件(如果该文件存在)。如果该文件不存在,则呈现适当回退区域性的调试文件。
有关如何本地化资源的更多信息,请参见组件库资源本地化概述。
错误处理
下面的示例显示使用 ScriptManager 控件的不同情形。
启用部分页面更新
下面的示例显示如何使用 ScriptManager 控件来启用部分页面更新。在此示例中,Calendar 和 DropDownList 控件位于 UpdatePanel 控件内部。默认情况下,UpdateMode 属性的值为 Always,而 ChildrenAsTriggers 属性的值为 true。因此,面板的子控件会导致异步回发。
<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
Sub DropDownSelection_Change(ByVal Sender As Object, ByVal E As EventArgs)
Calendar1.DayStyle.BackColor = _
System.Drawing.Color.FromName(ColorList.SelectedItem.Value)
End Sub
Protected Sub Calendar1_SelectionChanged(ByVal Sender As Object, ByVal E As EventArgs)
SelectedDate.Text = Calendar1.SelectedDate.ToString()
End Sub
</script>
<html >
<head id="Head1" runat="server">
<title>UpdatePanel Example</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1"
runat="server" />
<asp:UpdatePanel ID="UpdatePanel1"
runat="server">
<ContentTemplate>
<asp:Calendar ID="Calendar1"
ShowTitle="True"
OnSelectionChanged="Calendar1_SelectionChanged"
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>
<br />
Selected date:
<asp:Label ID="SelectedDate"
runat="server">None.</asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
<br />
</div>
</form>
</body>
</html>
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
void DropDownSelection_Change(Object sender, EventArgs e)
{
Calendar1.DayStyle.BackColor =
System.Drawing.Color.FromName(ColorList.SelectedItem.Value);
}
protected void Calendar1_SelectionChanged(object sender, EventArgs e)
{
SelectedDate.Text =
Calendar1.SelectedDate.ToString();
}
</script>
<html >
<head id="Head1" runat="server">
<title>UpdatePanel Example</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:ScriptManager ID="ScriptManager1"
runat="server" />
<asp:UpdatePanel ID="UpdatePanel1"
runat="server">
<ContentTemplate>
<asp:Calendar ID="Calendar1"
ShowTitle="True"
OnSelectionChanged="Calendar1_SelectionChanged"
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>
<br />
Selected date:
<asp:Label ID="SelectedDate"
runat="server">None.</asp:Label>
</ContentTemplate>
</asp:UpdatePanel>
<br />
</div>
</form>
</body>
</html>
处理部分页面更新错误和注册脚本
下面的示例演示如何在部分页面更新期间提供自定义错误处理。默认情况下,如果在部分页面更新期间出现错误,则会显示一个 JavaScript 消息框。该示例演示如何通过为 AsyncPostBackError 事件提供处理程序,以及设置该事件处理程序中的 AsyncPostBackErrorMessage 属性来使用自定义错误处理。还可以设置 AllowCustomErrorsRedirect 属性来指定当在部分页面更新期间出现错误时,如何使用 Web.config 文件的自定义错误部分。在此示例中,使用 AllowCustomErrorsRedirect 属性的默认值。这表明如果 Web.config 文件包含 customErrors 元素,则该元素将决定如何显示错误。有关更多信息,请参见 customErrors 元素(ASP.NET 设置架构)。
<%@ Page Language="VB" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
Try
Dim a As Int32
a = Int32.Parse(TextBox1.Text)
Dim b As Int32
b = Int32.Parse(TextBox2.Text)
Dim res As Int32 = a / b
Label1.Text = res.ToString()
Catch ex As Exception
If (TextBox1.Text.Length > 0 AndAlso TextBox2.Text.Length > 0) Then
ex.Data("ExtraInfo") = " You can't divide " & _
TextBox1.Text & " by " & TextBox2.Text & "."
End If
Throw ex
End Try
End Sub
Protected Sub ScriptManager1_AsyncPostBackError(ByVal sender As Object, ByVal e As System.Web.UI.AsyncPostBackErrorEventArgs)
If (e.Exception.Data("ExtraInfo") <> Nothing) Then
ScriptManager1.AsyncPostBackErrorMessage = _
e.Exception.Message & _
e.Exception.Data("ExtraInfo").ToString()
Else
ScriptManager1.AsyncPostBackErrorMessage = _
"An unspecified error occurred."
End If
End Sub
</script>
<html >
<head id="Head1" runat="server">
<title>UpdatePanel Error Handling Example</title>
<style type="text/css">
#UpdatePanel1 {
width: 200px; height: 50px;
border: solid 1px gray;
}
#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"
OnAsyncPostBackError="ScriptManager1_AsyncPostBackError" runat="server" >
<Scripts>
<asp:ScriptReference Path="ErrorHandling.js" />
</Scripts>
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:TextBox ID="TextBox1" runat="server" Width="39px"></asp:TextBox>
/
<asp:TextBox ID="TextBox2" runat="server" Width="39px"></asp:TextBox>
=
<asp:Label ID="Label1" runat="server"></asp:Label><br />
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="calculate" />
</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>
</div>
</form>
</body>
</html>
<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Button1_Click(object sender, EventArgs e)
{
try
{
int a = Int32.Parse(TextBox1.Text);
int b = Int32.Parse(TextBox2.Text);
int res = a / b;
Label1.Text = res.ToString();
}
catch (Exception ex)
{
if (TextBox1.Text.Length > 0 && TextBox2.Text.Length > 0)
{
ex.Data["ExtraInfo"] = " You can't divide " +
TextBox1.Text + " by " + TextBox2.Text + ".";
}
throw ex;
}
}
protected void ScriptManager1_AsyncPostBackError(object sender, AsyncPostBackErrorEventArgs e)
{
if (e.Exception.Data["ExtraInfo"] != null)
{
ScriptManager1.AsyncPostBackErrorMessage =
e.Exception.Message +
e.Exception.Data["ExtraInfo"].ToString();
}
else
{
ScriptManager1.AsyncPostBackErrorMessage =
"An unspecified error occurred.";
}
}
</script>
<html >
<head id="Head1" runat="server">
<title>UpdatePanel Error Handling Example</title>
<style type="text/css">
#UpdatePanel1 {
width: 200px; height: 50px;
border: solid 1px gray;
}
#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"
OnAsyncPostBackError="ScriptManager1_AsyncPostBackError" runat="server" >
<Scripts>
<asp:ScriptReference Path="ErrorHandling.js" />
</Scripts>
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:TextBox ID="TextBox1" runat="server" Width="39px"></asp:TextBox>
/
<asp:TextBox ID="TextBox2" runat="server" Width="39px"></asp:TextBox>
=
<asp:Label ID="Label1" runat="server"></asp:Label><br />
<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="calculate" />
</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>
</div>
</form>
</body>
</html>
全球化浏览器中显示的日期和时间
下面的示例演示如何设置 EnableScriptGlobalization 属性,以便客户端脚本可以在浏览器中显示区域性特定的日期和时间。在本例中,@ Page 指令的 Culture 属性设置为 auto。因此,在当前浏览器设置中指定的第一种语言决定了页面的区域性和 UI 区域性。有关更多信息,请参见如何:为 ASP.NET 网页全球化设置区域性和 UI 区域性。
<%@ Page Language="VB" Culture="auto" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html >
<head id="Head1" runat="server">
<title>Globalization Example</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" EnableScriptGlobalization="true" runat="server">
</asp:ScriptManager>
<script type="text/javascript">
function pageLoad() {
Sys.UI.DomEvent.addHandler($get("Button1"), "click", formatDate);
}
function formatDate() {
var d = new Date();
try {
$get('Label1').innerHTML = d.localeFormat("dddd, dd MMMM yyyy HH:mm:ss");
}
catch(e) {
alert("Error:" + e.message);
}
}
</script>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="False" UpdateMode="Conditional">
<ContentTemplate>
<asp:Panel ID="Panel1" runat="server" GroupingText="Update Panel">
<asp:Button ID="Button1" runat="server" Text="Display Date" />
<br />
<asp:Label ID="Label1" runat="server"></asp:Label>
</asp:Panel>
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>
<%@ Page Language="C#" Culture="auto" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html >
<head id="Head1" runat="server">
<title>Globalization Example</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" EnableScriptGlobalization="true" runat="server">
</asp:ScriptManager>
<script type="text/javascript">
function pageLoad() {
Sys.UI.DomEvent.addHandler($get("Button1"), "click", formatDate);
}
function formatDate() {
var d = new Date();
try {
$get('Label1').innerHTML = d.localeFormat("dddd, dd MMMM yyyy HH:mm:ss");
}
catch(e) {
alert("Error:" + e.message);
}
}
</script>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" ChildrenAsTriggers="False" UpdateMode="Conditional">
<ContentTemplate>
<asp:Panel ID="Panel1" runat="server" GroupingText="Update Panel">
<asp:Button ID="Button1" runat="server" Text="Display Date" />
<br />
<asp:Label ID="Label1" runat="server"></asp:Label>
</asp:Panel>
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>
System..::.Object
System.Web.UI..::.Control
System.Web.UI..::.ScriptManager
此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。
Windows Vista, Windows XP SP2, Windows Server 2003
.NET Framework 和 .NET Compact Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求。
.NET Framework
受以下版本支持:3.5
参考
其他资源