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属性都很简单。
?作者:
TerryLee
出处:
http://terrylee.cnblogs.com
弹出窗口的方法:
ScriptManager.RegisterStartupScript(this.UpdatePanel1,this.GetType(),"updateScript","alert('保存成功')",true);
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=2141919
?