使用ASP.NET AJAX非同步呼叫Web Service和頁面中的類方法(圖)(2)

來源:互聯網
上載者:User

讓用戶端JavaScript直接能夠非同步呼叫到伺服器端的Web Service,這看起來真的是個不錯的主意——理想化的分層Ajax應用程式就應該這樣嘛!不過作為被ASP.NET伺服器端開發模型“寵壞”了的我們,更加熟悉的方法是直接將方法寫在ASP.NET頁面中,比如處理頁面中的某個伺服器端按鈕Click事件的代碼,就可能這樣調用定義在同一張頁面代碼檔案中的方法:

protected void Button1_Click(object sender, EventArgs e)
{
myLabel.Text = this.GetTextForLabel();
}
 
public string GetTextForLabel()
{
// ......
return "Some Text";
}

對於那些“遺留”的ASP.NET應用程式來講,這樣直接定義在ASP.NET頁面中的方法更是相當常見。若是僅僅為了配合ASP.NET AJAX的用戶端訪問Web Service功能,就將這些方法一一遷移到Web Service中,豈不是非常麻煩?

好在ASP.NET AJAX在設計時考慮到了這個問題,並提供給我們一種作為替代的選擇。ASP.NET AJAX非同步通訊層能夠將聲明在ASP.NET頁面中的公有的類方法(C#中的static,VB.NET中的Shared)當作Web Service中聲明的方法一樣對待,為其產生類似的用戶端調用代理。

我們還是通過一個執行個體程式來瞭解這個功能。該樣本程式的功能與介面均與前面一節中的完全一致,唯一的不同就是,用戶端非同步呼叫的不再是某個Web Service,而是定義在ASP.NET頁面中的類方法。

首先是定義在ASP.NET頁面中的類方法,完整的方法聲明如下:

[WebMethod]
public static string SayHelloFromPage(string name)
{
return string.Format("Hello {0}!", name);
}

特別需要注意的是,若要讓ASP.NET AJAX為其產生用戶端調用代理,那麼一定要為該方法添加[WebMethod]屬性。

然後是ScriptManager控制項,注意粗體部分代碼設定了EnablePageMethods屬性為true,這也是讓用戶端能夠直接調用伺服器端頁面方法所必需的。若你忘記了設定該屬性,那麼程式將無法完成預期功能:

<asp:ScriptManager ID="sm" EnablePageMethods="true" runat="server" />

程式介面中的UI元素和前一個節中的樣本程式完全一致,這裡不贅:

<input id="tbName" type="text" />
<input id="btnInvoke" type="button" value="Say Hello"
onclick="return btnInvoke_onclick()" />
<div id="result"></div>

而本樣本程式中按鈕的click事件處理函數以及非同步呼叫的回呼函數則需要一定的修改,如下所示:

function btnInvoke_onclick() {
var theName = $get("tbName").value;
PageMethods.SayHelloFromPage(theName, onSayHelloSucceeded);
}
 
function onSayHelloSucceeded(result) {
$get("result").innerHTML = result;
}

注意上述代碼中的粗體部分。可以看到,調用頁面方法代理時統一的首碼為PageMethods。接下來是頁面方法的名稱,這裡為SayHelloFromPage(),其參數列表和C#中方法的定義一致,額外的一個參數表示本次非同步呼叫的回呼函數。即文法為:

PageMethods.[MethodName](param1, param2 …, callbackFunction);

這樣即完成了本樣本程式,運行一下,我們將會看到3-1和圖3-2一樣的介面。

總結:想要使用ASP.NET AJAX在用戶端JavaScript中非同步呼叫定義在ASP.NET頁面中的方法,我們需要:

  1. 將該方法聲明為公有(public);
  2. 將該方法聲明為類方法(C#中的static,VB.NET中的Shared),而不是執行個體方法;
  3. 為該方法添加[WebMethod]屬性;
  4. 將頁面中ScriptManager控制項的EnablePageMethods屬性設定為true;
  5. 在用戶端使用如下JavaScript文法調用該頁面方法:
    PageMethods.[MethodName](param1, param2 …, callbackFunction);
  6. 為用戶端非同步呼叫指定回呼函數,在回呼函數中接收傳回值並進一步處理。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.