前面兩篇內容中,我們看到了DirectEvents方便調用服務器端方法、DirectEvents調用WebService方法的使用方法,今天我們來看看DirectMethods,這家伙可比DirectEvents更加靈活了,它可以像調用JS方法一樣來異步調用服務器端的方法。
使用DirectMethods在JS中調用C#方法
我承認,這個標題有點噱頭,其實應該是通過DirectMethods,在JS中通過異步調用的方式執行服務器端的方法。
來看一個例子吧:
[DirectMethod] public void AddToServerTime(int hours) { var date = DateTime.Now.Add(new TimeSpan(hours, 0, 0)); this.myLabel.Text = date.ToString(); }
這是一個aspx頁面中的服務器端方法,為了能夠在JS中來調用,必須添加DirectMethod特性。
接下來讓我們看看JS調用:
<script type="text/javascript"> function fnUpdate() { App.direct.AddToServerTime(3); } </script>
就是這句話,它被定義在命名空間App.direct下,當然,這個命名空間是可以修改的,我會在接下來告訴你怎么修改。
然后添加一個按鈕,在點擊按鈕的時候來執行fnUpdate方法。
<ext:Window runat="server" ID="win1" Width="300" Height="200" Title="DirectMethods"> <Items> <ext:Label runat="server" ID="myLabel"></ext:Label> </Items> <Buttons> <ext:Button runat="server" ID="btnUpdate" Text="更新" Handler="fnUpdate()"></ext:Button> </Buttons> </ext:Window>
我們這里使用的是Ext.Net按鈕,你還可以使用Asp.Net按鈕,或者是Html按鈕,不再細說。
然后我們編譯代碼,刷新頁面,點擊這個按鈕吧,你會看到window中的顯示:
設置DirectMethods的命名空間
默認情況下,DirectMethods的命名空間是App.direct,我們可以通過N中方法來改變這個默認的命名空間:
在Ext.Net全局配置中更改
<extnet theme="Neptune"
directMethodNamespace="MyApp.DirectMethods
" />
這種更改方式是在web.config中完成的,如果你不知道怎么在web.config中添加extnet配置節點,那么你肯定是沒有看我的第一篇筆記,去看看吧>>在ASP.NET WebForm中使用Ext.Net
這種更改方式將對所有頁面有效。
在Ext.Net ResourceManager配置中更改
<ext:ResourceManager runat="server" DirectMethodNamespace="MyApp.DirectMethods"> </ext:ResourceManager>
這種更改方式是在頁面中完成的,它只對當前頁面有效,當然了,它肯定是要覆蓋全局的設置的。
在DirectMethod特性構造函數中更改
這是最后一種設置方式,它更加靈活,它可以更改某一個方法的命名空間。
[DirectMethod(Namespace = "MyApp.DirectMethods"
)] public void AddToServerTime(int hours) { var date = DateTime.Now.Add(new TimeSpan(hours, 0, 0)); this.myLabel.Text = date.ToString(); }
這種方法只對設置的方法有用,它將會覆蓋頁面和全局的配置。
添加回調方法
前面提到過,Ext.Net DirectMethods和DirectEvents類似,都是通過JS實現的異步調用,因此,如果要處理服務器端的執行結構,就必須在JS中添加相應的回調方法。
function fnUpdate() { MyApp.DirectMethods.AddToServerTime(5, { success: onSuccess, failure: onFailure, eventMask: { showMask: true } }); } function onSuccess() { alert("成功"); } function onFailure() { alert("失敗"); }
在這段代碼中,我們在調用DirectMethod方法的時候添加了一些配置,包括執行成功和失敗的回調方法,以及來顯示一個遮罩層。
同步執行服務器端方法
一般情況下我們都是采用異步的方式來執行服務器端的方法,這樣能夠獲得更好的用戶體驗,當然,如果你有怪癖,希望能夠通過同步的方式來執行服務器端方法,Ext.Net DirectMethods也是支持的。
[DirectMethod(Namespace = "MyApp.DirectMethods", Async = false)] public void AddToServerTime(int hours) { string text = this.btnUpdate.Text; var date = DateTime.Now.Add(new TimeSpan(hours, 0, 0)); this.myLabel.Text = text + date.ToString(); }
很簡單的一個設置,在DirectMethod構造函數中配置一下就可以了。
鄭重的提醒,盡量少用同步的請求,這樣會造成瀏覽器假死的現象,至於什么是瀏覽器假死,你去試試搶一下春運時候的火車票就知道了(這里說的是2014年春運的火車票,今天是2014年1月16日,目前12306的驗證碼校驗用的就是同步請求,不知道有多少同學被卡死在校驗驗證碼的路上……)
提升性能:調用靜態方法
先來說說非靜態方法,在執行非靜態方法的時候,Ext.Net會提交更多的數據,使我們可以訪問頁面中的控件這在處理頁面相關內容時候非常有用,但是當我們只是想去執行一個處理過程,而與頁面無關的時候,我們就可以通過執行靜態方法來提升性能。
在靜態方法中,我們不能訪問頁面的Form數據,不能直接訪問Request、Response等數據(可以通過HttpContext.Current來訪問),好處是在請求的時候,Ext.Net不會將頁面數據提交給服務器,大大減少了數據傳輸和服務器執行的時間。
[DirectMethod(Namespace = "MyApp.DirectMethods")] public static string AddToServerTime(int hours) { var date = DateTime.Now.Add(new TimeSpan(hours, 0, 0)); return date.ToString(); }
這是我們剛才的方法,現在把它改成了靜態方法。JS的調用基本沒有改變,只不過我們需要在JS中來更新控件的顯示了。
function fnUpdate() { MyApp.DirectMethods.AddToServerTime(5, { success: onSuccess, failure: onFailure, eventMask: { showMask: true } }); } function onSuccess(result) { App.myLabel.setText(result); }
我們需要對onSuccess回調方法進行修改,在它接收到執行結果之后更新界面顯示。
Ext.net.DirectMethod.request調用WebService
DirectMethods不能直接訪問WebService,但可以通過Ext.net.DirectMethod.request來請求WebService,實現類似於頁面后台方法的效果。
var showRelativeServerTime = function () { Ext.net.DirectMethod.request({ url: "EchoService.asmx/Echo", cleanRequest: true, params: { something: "Hello world!" }, success: function (result) { alert(Ext.DomQuery.selectValue("string", result, "")); } }); }
這是方法的調用過程,不再演示了。
附加說明:這種方法受用於一切WebService、一般處理程序、MVC等通過url訪問的東東,非常好用。
異常處理
這是一個大問題,一般情況下,如果你想偷懶,Ext.Net默認已經幫我們進行了異常處理。當然,如果你想更友好的給用戶進行提示,那就來手動處理吧。
[DirectMethod] public static int Divide(int number1, int number2) { if (number2 == 0) { ResourceManager.AjaxSuccess = false; ResourceManager.AjaxErrorMessage = "number2 can't be zero!"; return 0; } return number1 / number2; }
這樣一來,我們手動的判斷是否執行成功。當然,你還可以這樣寫:
[DirectMethod] public static void DoSomething() { try { // call through to your business logic layer } catch (Exception e) {
ResourceManager.AjaxSuccess = false
; ResourceManager.AjaxErrorMessage = GetFriendlyMessage(e); // Do any logging and other operations here } }
OK,Ext.Net DirectMethods的用法就介紹這么多,希望可以幫到你們。