頁面方法只是頁面代碼類中所暴露的帶有WebMethod特性的公用靜態方法。頁面方法和支援AJAX的Web服務的運行時引擎幾乎相同。使用頁面方法,我們不用建立和發布服務。
頁面方法的定義
在頁面代碼類中定義公用靜態方法,並為其添加WebMethod特性,便會將ASP.NET AJAX頁面轉化為Web服務:
public class TimeServicePage : System.Web.UI.Page
{
[WebMethod]
public static DateTime GetTime()
{
return DateTime.Now;
}
}
我們可以在頁面方法中使用任何資料類型,所有類型在調用期間都會被轉換為JSON格式。
我們也可以在aspx源檔案中以內聯方式定義Web方法:
<script type="text/C#" runat="server">
[WebMethod]
public static DateTime GetTime()
{
return DateTime.Now;
}
</script>
注意,頁面方法針對的是給定的ASP.NET頁面,只有宿首頁面才能調用自身的Web方法,不支援跨頁面調用。
頁面方法的啟用
如果ASP.NET AJAX頁面的代碼類中包含WebMethod修飾的靜態方法,運行時引擎會產生與Web服務一樣的JavaScript代理類。我們可使用該類的實現來調用伺服器方法。該類的名稱會被寫入程式碼為PageMethods。
注意,頁面方法在預設情況下是被禁用的。為啟用它,我們必須將指令碼管理器的EnablePageMethods屬性設為true。
<asp:ScriptManager runat="server" ID="ScriptManager1" EnablePageMethods="true" />
為能執行頁面方法,必須在web.config檔案中HTTP模組ScriptModule:
<httpModules>
<add name="ScriptModule"
type="System.Web.Handlers.ScriptModule, System.Web.Extensions" />
</httpModules>
該模組的工作過程是,監聽工作階段狀態載入後的應用程式事件,執行頁面方法,然後為調用者產生響應。由於擷取工作階段狀態是在啟動頁面生命週期之前執行的,所以,這種方法調用不會建立頁面的生命週期,也不會進行子控制項的初始化和處理。
頁面方法的使用
頁面方法的集合會以固定的類名暴露給JavaScript代碼--PageMethods。該類會列出所有靜態方法,且該類不需自行執行個體化。
PageMethods代理類
與Web服務的代理類不同,PageMethods代理類總會以內聯指令碼的形式嵌在引用它的頁面主體中。否則,對於不同的頁面,該類的名稱應各不相同。該類的結構幾乎與AJAX Web服務代理類的結構相同。
頁面方法的執行
以上述代碼中的GetTime方法為例:
function getTime()
{
PageMethods.GetTime(methodCompleted);
}
function methodCompleted(results, context, methodName)
{
var displayString = results.format("ddd, dd MMMM yyyy");
$get("Label1").innerHTML = displayString;
}
通過頁面方法,我們能夠使用HttpContext的Current屬性訪問檢視狀態、ASP.NET Cache、User和其他內部對象。HTTP上下文針對的不是頁面的生命週期,它在接到請求後就存在,並一直伴隨著請求而存在。