Ext.Net學習筆記07:Ext.Net DirectMethods用法詳解


前面兩篇內容中,我們看到了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中的顯示:

image

設置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的用法就介紹這么多,希望可以幫到你們。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM