資料中如實是說:
1, ScriptManager(指令碼控制器)是asp.net ajax存在的基礎.
2, 一個頁面只允許有一個ScriptManager,並且放在其他ajax控制項的前面.
3,ScriptManager掌管著用戶端Ajax頁的多有指令碼,並在頁面中註冊Ajax類庫,用來實現頁面的局部更新和對Web服務的調用.
下面是scriptManager的結構:
下面介紹下ScriptManager的幾個屬性和一些子項目
a, EnablePartialRendering: (預設局部渲染)比較重要,用來表示此頁面是否允許局部重新整理(預設為true)
b, AllowCustomErrorsRedirect :當發生錯誤時候,是否導航到web.config中定義的錯誤頁面,如果設定為false,則使用AsyncPostBackErrorMessage和OnAsyncPostBackError提示錯誤.
c, AsyncPostBackErrorMessage: 非同步呼叫發生錯誤時的提示資訊.
d, OnAsyncPostBackError: 非同步呼叫發生錯誤時的事件
e, AsyncPostBackTimeOut: 非同步呼叫的有效時間 預設為 90秒
f, AuthenticationService: 用來表示提供驗證服務的路徑.
g, ProfileService 表示提供個人化服務的路徑
h, Scripts 對指令碼的調用,可以恰套多個ScriptReference摸板對多個指令檔的調用
i, Service 對服務的調用 也可以恰套多個ServiceReference摸板以實現多個服務的引用
下面簡單介紹下上面屬性的基本使用格式:
呼叫指令碼檔案:
指令碼語言我們可以直接寫在頁面的<script></script> 元素內
也可以使用註冊方式在頁面的head中
<script type="text/javascript" src=""> <script>
在ajax技術中也提供了一種註冊方式,
<asp:ScriptManager ID="ScriptManager" runat="server">
<Scripts>
<asp:ScriptReference Path="" />
<Scripts>
</asp:ScriptManager>
從<Scripts>來看,它可以多個js檔案,如果單能實現這個功能覺得微軟有點話蛇添足,它的主要用途是調用ajax中已經存在的Javascrtpt指令檔.
如:
<asp:ScriptManager runat="server" ID="scriptManager">
<Scripts>
<asp:ScriptReference Assembly="Microsoft.Web.Preview" Name="PreviewScript.js" />
<ssp:ScriptReference Assembly="Microsoft.Web.Preview" Name="PreviewDragDrop.js />
</asp:ScriptManager>
調用Web Service
ScriptManager的主要作用就是在用戶端 調用一些伺服器的代碼,比較常用的就是將web service註冊在用戶端,從而可以用javascript指令碼中實現對web service的調用
下面使用倆個例子說明對web service中方法的調用:
頁面代碼:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>無標題頁</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<input type="text" id="txtName" />
<input type="button" value="帶參數的web service方法調用" onclick="ReferencSercviceMethod2()" />
<input type="button" value="不帶參數的web service方法調用" onclick="ReferenceServiceMethod1()" />
</div>
<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="WebServiceTest.asmx" />
</Services>
<Scripts>
<asp:ScriptReference Path="Script/JScript.js" />
</Scripts>
</asp:ScriptManager>
</form>
</body>
</html>
js代碼:
function ReferenceServiceMethod1(){
WebServiceTest.HelloWorld(GetResult);
}
function GetResult(result){
alert(result);
}
function ReferencSercviceMethod2(){
WebServiceTest.SayHelloWorld(document.getElementById("txtName").value,GetResult);
}
web service代碼:
using System;
using System.Collections;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
/// <summary>
///WebServiceTest 的摘要說明
/// </summary>
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
//這句一定要加上
[System.Web.Script.Services.ScriptService]
public class WebServiceTest : System.Web.Services.WebService {
public WebServiceTest () {
//如果使用設計的組件,請取消注釋以下行
//InitializeComponent();
}
[WebMethod]
public string HelloWorld() {
return "Hello World";
}
[WebMethod]
public string SayHelloWorld(string name)
{
return "Hello World " + name;
}
}
下面簡單介紹下用scriptManager的動態註冊一個web service
可以刪除掉上面頁面代碼中<Services></Services>段
在page的代碼的load事件中加入下面代碼:
protected void Page_Load(object sender, EventArgs e)
{
ServiceReference service = new ServiceReference("WebServiceTest.asmx");
ScriptManager1.Services.Add(service);
}
OnAsyncPostBackError的使用
在scriptManager中可以捕獲局部更新失敗的錯誤,OnAsyncPostError表示當回傳處理髮生錯誤時的事件
AsyncPostBackMessage表示發生錯誤時的提示資訊。
頁面代碼:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>無標題頁</title>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server"
onasyncpostbackerror="ScriptManager1_AsyncPostBackError">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:Button ID="Button1" runat="server" Text="觸發錯誤按鈕" onclick="Button1_Click" />
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>
cs檔案代碼:
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
try
{
(int.Parse("") + 1).ToString();
}
catch ( Exception ex)
{
ex.Data["ExtraInfo"] = "類型轉換錯誤!";
throw ex;
}
}
protected void ScriptManager1_AsyncPostBackError(object sender, AsyncPostBackErrorEventArgs e)
{
if (e.Exception.Data["ExtraInfo"] != null)
{
ScriptManager1.AsyncPostBackErrorMessage = e.Exception.Message + "---注意";
}
else
{
ScriptManager1.AsyncPostBackErrorMessage = "其他原因導致運行失敗";
}
}
}