一、Ext.NET 1.7官方示例筆記-事件

官網參考地址:https://examples1.ext.net/#/Events/DirectEvents/Overview/javascript

先了解一下「事件」css

Ext.NET包括3種事件機制html

DirectEvents摘要

如下每一個示例的操做都將觸發對服務器的DirectEvent Ajax請求,並將通知窗口返回給瀏覽器前端

//服務端代碼,會向客戶端返回一條服務器時間信息提示
<script runat="server"> protected void UpdateTimeStamp(object sender, DirectEventArgs e) { X.Msg.Notify("The Server Time is: ", DateTime.Now.ToLongTimeString()).Show(); } </script>
使用方法一,把 DirectEvent 添加到按鈕中
<ext:Button ID="Button1" runat="server" Text="點擊我" OnDirectClick="UpdateTimeStamp" />
這樣就能訪問服務器的 UpdateTimeStamp 方法了,點擊後會在瀏覽器右下角彈出消息提示

----------------------------------------------------------------------------------------------java

使用方法二,提交服務器請求前加確認提示程序員

<ext:Button ID="Button4" runat="server" Text="點擊我">
     <DirectEvents>
          <Click OnEvent="UpdateTimeStamp">
                <Confirmation ConfirmRequest="true" Title="Title" Message="你肯定要向服務器發出請求嗎..." />
          </Click>
     </DirectEvents>
</ext:Button>  
點擊後會跳出提示窗,點擊是,會發出請求,點擊否,不發出請求,很適合刪除記錄前須要一個再確認的動做。

--------------------------------------------------------------------------------------------------------------------後端

使用方法三,給傳統的<asp:Button>添加 DirectEvent 事件
<asp:Button ID="Button2" runat="server" Text="Click Me" />

看上去什麼都沒有,這是一個標準的aspx控件,若是要讓它和Ext.NET DirectEvent 事件產生關聯,就須要在資源管理標記里加些東西
瀏覽器

<ext:ResourceManager runat="server">
     <CustomDirectEvents>
          <ext:DirectEvent Target="Button2" OnEvent="UpdateTimeStamp" />                
     </CustomDirectEvents>
</ext:ResourceManager>

他們關聯的標記就是 ID="Button2" => Target="Button2" ,Target 就是目標的意思,意思是做用於那個對象上!服務器

這樣點擊按鈕也能夠請求服務器的方法app

--------------------------------------------------------------------------------------------------------------------------

使用方法四,綁定一個標準的HTML <input> button 

<input id="Button3" type="button" value="Click Me" />
這個和什麼的用法同樣,也要在資源管理標記中加上
-----------------------------------------------------------------------------
使用方法五,和 HTML 標記 <span>關聯
<span id="Span1" style="cursor: pointer;">*Click Me*</span>
這個也和上面的同樣,要在資源管理標記中添加,改成Target="Span1" 就能夠了,
style="cursor: pointer;" 的做用是,鼠標移到span標記上變手型狀。
-------------------------------------------------------------------------------
使用方法六,使用目標查詢將Click DirectEvent添加到多個html <div>元素

經過使用目標查詢,咱們能夠將相同的DirectEvent(或監聽器)附加到幾個html元素或控件,並觸發服務器端事件。

目標不須要「id」,也不須要runat =「server」屬性。元素能夠是頁面上可用的任何html元素。

如下目標查詢將選擇頁面上包含css類「box」的全部<div>元素,但不包含css類「red」。

<div class="box">Click Me</div>
<div class="box red">Not Me</div>
<div class="box blue">Click Me too!</div>

<ext:ResourceManager runat="server">
    <CustomDirectEvents>                
         <ext:DirectEvent Target="${div.box:not(div.red)}" OnEvent="UpdateTimeStamp" />
    </CustomDirectEvents>
</ext:ResourceManager>
$表示選取的意思,div.box 表示div元素class爲box的元素,:not(div.red)是個過濾器,表示排除div 標籤有class=red的標籤。和jQuery很像!
由於我不瞭解ExtJS,因此只能用jQuery類比。Ext.NET 就是用.net技術包裝ExtJS 前端庫的,方便.net 程序員操做ExtJS.
--------------------------------------------------------------------------------------

異步DirectEvents

快速單擊每一個按鈕。每一個將在其配置的延遲後返回值,該延遲模擬長時間運行的服務器端任務。

<ext:Button runat="server" Text="Submit 1 (10 sec)" OnDirectClick="Button1_Click" />
<ext:Button runat="server" Text="Submit 2 (1 sec)" OnDirectClick="Button2_Click" />
<ext:Button runat="server" Text="Submit 3 (5 sec)" OnDirectClick="Button3_Click" />
<ext:Button runat="server" Text="Submit 4 (1 sec)" OnDirectClick="Button4_Click" />

<ext:Label ID="Label1" runat="server" /><br />
<ext:Label ID="Label2" runat="server" /><br />
<ext:Label ID="Label3" runat="server" /><br />
<ext:Label ID="Label4" runat="server" />
//服務端腳本
<script runat="server"> protected void Button1_Click(object sender, DirectEventArgs e) { System.Threading.Thread.Sleep(10000); this.Label1.Text = "Label1 : " + DateTime.Now.ToLongTimeString(); } protected void Button2_Click(object sender, DirectEventArgs e) { System.Threading.Thread.Sleep(1000); this.Label2.Text = "Label2 : " + DateTime.Now.ToLongTimeString(); } protected void Button3_Click(object sender, DirectEventArgs e) { System.Threading.Thread.Sleep(5000); this.Label3.Text = "Label3 : " + DateTime.Now.ToLongTimeString(); } protected void Button4_Click(object sender, DirectEventArgs e) { System.Threading.Thread.Sleep(1000); this.Label4.Text = "Label4 : " + DateTime.Now.ToLongTimeString(); } </script>
-------------------------------------------------------------------------------------------

DirectEvent鏈接到[WebMethod] WebService

如下示例演示如何配置DirectEvent以鏈接到ASP.NET WebService [WebMethod]以及兩個用於將數據返回給客戶端的選項。

第一個Button調用a [WebMethod]並返回一個簡單的腳本,該腳本在成功響應後在客戶端上執行。//從服務器返回的字符串腳本「alert('')」

第二個Button調用a [WebMethod]並返回帶有「Greeting」的新參數。而後,Greeting參數的值用於填充簡單的JavaScript alert消息。

    <script type="text/javascript">
        var sayHello = function (result) {
            var params = result.extraParamsResponse || {};//若是result有返回參數就給params,不然給空對象

            if (params.Greeting) { 
                alert(params.Greeting);
            }
        }
    </script>

        <ext:Panel 
            runat="server" 
            Title="Say Hello" 
            Width="300" 
            Height="185" 
            Frame="true" 
            ButtonAlign="Center"
            Layout="Form">
            <Items>
                <ext:TextField 
                    ID="txtName" 
                    runat="server" 
                    FieldLabel="Name" 
                    EmptyText="Your name here..." 
                    AnchorHorizontal="100%" 
                    />
            </Items>
            <Buttons>
                <ext:Button runat="server" Text="[WebMethod]">
                    <DirectEvents>
                        <Click 
                            Url="TestService.asmx/SayHello1" 
                            Type="Load" 
                            Method="POST" 
                            CleanRequest="true">
                            <ExtraParams>
                                <ext:Parameter Name="name" Value="#{txtName}.getValue()" Mode="Raw" />
                            </ExtraParams>
                        </Click>
                    </DirectEvents>
                </ext:Button>
                
                <ext:Button runat="server" Text="[WebMethod] with Params">
                    <DirectEvents>
                        <Click 
                            Success="sayHello(result);" //多了這個,若是成功返回,就調用客戶js方法
                            Url="TestService.asmx/SayHello2" 
                            Type="Load" 
                            Method="POST" 
                            CleanRequest="true">
                            <ExtraParams>
                                <ext:Parameter Name="name" Value="#{txtName}.getValue()" Mode="Raw" /> //Mode=Raw 表示值是經過計算獲取的
                            </ExtraParams>
                        </Click>
                    </DirectEvents>
                </ext:Button>
            </Buttons>
        </ext:Panel>
    </form>
using System.Web.Services;
using Ext.Net;

namespace Ext.Net.Examples
{
    /// <summary>
    /// Summary description for TestService
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
    // [System.Web.Script.Services.ScriptService]
    public class TestService : System.Web.Services.WebService
    {
        [WebMethod]
        public DirectResponse SayHello1(string name)
        {
            DirectResponse response = new DirectResponse();
            
            // Return a script to be executed on the client
            response.Script = string.Concat("alert('Hello, ", name, "');");

            return response;
        }

        [WebMethod]
        public DirectResponse SayHello2(string name)
        {
            DirectResponse response = new DirectResponse();
            
            ParameterCollection parameters = new ParameterCollection();

            parameters["Greeting"] = "Hello, " + name;
            
            response.ExtraParamsResponse = parameters.ToJson();

            return response;
        }
    }
}
後端WebService代碼

DirectMethod概述

DirectMethod提供從客戶端JavaScript代碼調用服務器端.NET方法的功能。

使用[DirectMethod]屬性裝飾服務器端publicpublic static方法會將服務器端方法公開給客戶端JavaScript。

DirectMethod & DirectEvent 使用效果是同樣的,都是從前端異步調用後端的C#方法,而後返回信息。

DirectEvent 主要是監控相應事件,而DirectMethod是從前端直接調用,須要方法加 [DirectMethod] 特性便可。

1.基本DirectMethod

下面演示了一個更新<ext:Label>控件的簡單[DirectMethod]。

<script runat="server">
    [DirectMethod]
    public void SetTimeStamp()
    {
        this.Label1.Text = DateTime.Now.ToLongTimeString();
        this.Label1.Element.Highlight();
    }
</script>

 

<ext:Button ID="Button1" runat="server" Text="Click Me" Icon="Lightning">
      <Listeners>
            <Click Handler="Ext.net.DirectMethods.SetTimeStamp();" />
      </Listeners>
</ext:Button>
 <br />
        
 <ext:Label ID="Label1" runat="server" Format="Server Time: {0}" Text='<%# DateTime.Now.ToLongTimeString() %>' />
先是ext:Label 本身獲取服務器時間,點擊按鈕調用服務端方法執行獲取服務器時間並更新前端ext:Label 顯示文本,並高亮。


2.從DirectMethod返回一個字符串 

能夠從DirectMethod返回任何類型的對象。該對象被序列化爲JSON。序列化對象做爲'result'參數發送到DirectMethod配置中配置的'success'函數。

<script runat="server">
    [DirectMethod]
    public string GetTimeStamp()
    {
        return DateTime.Now.ToLongTimeString();
    }
</script>

<ext:Button runat="server" Text="Click Me" Icon="Lightning">
    <Listeners>
        <Click Handler="
            Ext.net.DirectMethods.GetTimeStamp({
                success: function (result) {
                    Ext.Msg.alert('Server Time', result);
                }
            });" />
    </Listeners>
</ext:Button>

3.將多個參數傳遞給DirectMethod

若是服務器端DirectMethod須要參數,則還將建立客戶端DirectMethod,並指望傳遞兩個參數的值。

例如,若是服務器端方法須要stringint論證,既有效的stringnumber必須被傳遞到客戶端的功能。

<script runat="server">
    [DirectMethod]
    public void LogCompanyInfo(string name, int count)
    {
        string template = string.Concat("{0} has approximately {1} employees.");
        string[] employees = new string[4] { "1-5", "6-25", "26-100", "100+" };
        
        this.Label3.Text = string.Format(template, name, employees[count]);
    }
</script>

<ext:Button runat="server" Text="Submit">
    <Listeners>
        <Click Handler="Ext.net.DirectMethods.LogCompanyInfo('Ext.NET, Inc.', 0);" />
    </Listeners>
</ext:Button>

4.調用靜態方法DirectMethod並返回一個字符串(Super Fast + Best Performance)

調用公共服務器端方法時,默認狀況下會執行完整的頁面生命週期,而且方法能夠訪問頁面上的全部Web控件。

使用「靜態」[DirectMethod],不會執行頁面生命週期,也沒法訪問Page WebControl。(意味着在靜態方法裏,不能寫this.Label1 = "hello"; 給頁面控件屬性賦值了!)這減小了處理開銷並優化了性能。

<script runat="server">
    [DirectMethod]
    public static string GetTimeStamp4()
    {
        return DateTime.Now.ToLongTimeString();
    }
</script>

<ext:Button xrunat="server" Text="Click Me" Icon="Lightning">
    <Listeners>
        <Click Handler="
            Ext.net.DirectMethods.GetTimeStamp4({
                success: function (result) {
                    Ext.Msg.alert('Server Time', result);
                }
            });" />
    </Listeners>
</ext:Button>  

也就是說非靜態 DirectMethod 方法會執行整個頁面的生命週期的方法,如:點擊按鈕後不是直接執行GetTimeStamp() 方法,而是先執行 Page_Load()方法,再執行GetTimeStamp() 方法!

咱們把GetTimeStamp() 方法改成靜態的試試會不會執行Page_Load(),結果是:直接執行了GetTimeStamp(),沒有執行Page_Load()方法,這樣提高了很大性能!!

靜態方法斷點截圖

5.從靜態DirectMethod返回Customer對象

能夠從DirectMethod返回任何類型的對象。如下示例建立並返回「Customer」對象。

Customer對象被序列化爲JSON並返回給客戶端(瀏覽器)。在DirectMethod配置對象中,'result'參數是返回對象。

<script runat="server">
    // Define Customer Class
    public class Customer
    {
        public int ID { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Company { get; set; }
        public Country Country { get; set; }
        public bool Premium { get; set; }
    }

    // Define Country Class
    public class Country
    {
        public string Name { get; set; }
    }

    [DirectMethod]
    public static Customer GetCustomer()
    {
        // Get your Customer data from somewhere...

        return new Customer() { 
            ID = 99,
            FirstName = "Peter",
            LastName = "Smith",
            Company = "CompanyX, LLC.",
            Premium = true,
            Country = new Country { Name = "Canada" }
        };
    }
</script>

<ext:Button runat="server" Text="Click Me" Icon="Lightning">
    <Listeners>
        <Click Handler="
            Ext.net.DirectMethods.GetCustomer({
                success : function (customer) {
                    var template = 'ID : {0}{6} Name : {1} {2}{6} Company : {3}{6} Country : {4}{6} Premium Member : {5}',
                        msg = String.format(template, 
                                customer.ID, 
                                customer.FirstName, 
                                customer.LastName, 
                                customer.Company, 
                                customer.Country.Name, 
                                customer.Premium, 
                                '<br /><br />');
                    
                    Ext.Msg.alert('Customer', msg);
                }
            });" />
    </Listeners>
</ext:Button>

6.禁用DirectMethod ClientProxy建立

當[DirectMethod]屬性添加到服務器端方法時,默認狀況下,將在客戶端Ext.net.DirectMethods arry中建立一個同名的JavaScript函數,並接受相同的參數。

例如,若是咱們在客戶端上建立名爲「GetTimeStamp」的服務器端方法,則還將建立Ext.net.DirectMethods.GetTimeStamp JavaScript函數。

在某些狀況下,開發人員可能決定建立DirectMethod,但不想在客戶端上公開相應的JavaScript函數。您能夠經過ClientProxy.Ignore在特定DirectMethod上設置屬性來配置DirectMethod以忽略建立相應的客戶端JavaScript函數

[DirectMethod(ClientProxy = ClientProxy.Ignore)] 
public string GetTimeStamp()
{ 
    return DateTime.Now.ToLongTimeString(); 
}

若是使用ClientProxy.Ignore設置DirectMethod,則不會建立相應的客戶端代理函數,但仍能夠調用DirectMethodDirectMethod代理函數是底層Ext.net.DirectMethod.request()函數的並行包裝器。

經過配置Ext.net.DirectMethod.request()函數,能夠直接調用任何服務器端DirectMethod(沒有客戶端代理函數)。

request(string methodName,[Object options]):void
按照methodName參數中的指定調用服務器端[DirectMethod]。
參數:
methodName:String
要調用的服務器端方法名稱。
選項:對象
(可選)包含配置屬性的對象。此選項對象能夠包含如下任何屬性,或Ext.Ajax.request中定義的選項。
成功:功能
要從DirectMethod成功響應時調用的JavaScript函數。
「 result」參數傳遞給success函數。
失敗:功能
若是從DirectMethod返回失敗響應,則調用JavaScript函數。
「 errorMessage」參數傳遞給success函數。
說明符:字符串
服務器端的方法訪問說明符,選項inlcude("public","static")。
「public」的說明符是默認值,不須要顯式設置。
若是服務器端Method是靜態方法,則說明符選項必須設置爲「static」。
方法:字符串
要生成的http請求的類型,選項包括("POST","GET")。
「POST」的方法是默認值。
url:字符串
從中調用DirectMethod的自定義URL。不須要在「父頁面」上配置DirectMethod。
若是未提供url,請求選項將使用<form>的action屬性。若是action屬性爲空,則請求選項將使用window.location.href值。若是window.location.href值以正斜槓(「/」)結尾,則IIS Web服務器可能沒法處理「POST」請求。在這種狀況下,您必須將「方法」選項屬性設置爲「GET」。
控制:字符串
包含DirectMethod的UserControl的ID。能夠在.ascx文件中配置DirectMethod,並從Parent .aspx頁面調用。
超時:數量
用於請求的超時(以毫秒爲單位)。(默認爲30000)
eventMask:Object
(可選)EventMask選項對象。此選項對象可能包含如下任何屬性:
showMask:Boolean
true顯示掩碼(默認爲false)。
msg:字符串
要在居中加載消息框中顯示的文本(默認爲「正在工做...」)。
msgCls:字符串
要應用於加載消息元素的CSS類(默認爲「x-mask-loading」)
target:String
要應用掩碼的目標元素,選項包括("page","customtarget")。
若是"customtarget",customTarget應設置配置選項。
customTarget:String
目標元素的id,或目標元素的實例。
minDelay:數字
顯示掩碼的最短期(默認爲0)。
設置minDelay提供了在刪除掩碼和執行成功,失敗和/或回調函數以前向用戶顯示消息的最少時間。
返回:
void
<script runat="server">
    [DirectMethod(ClientProxy = ClientProxy.Ignore)]
    public string GetTimeStamp6()
    {
        return DateTime.Now.ToLongTimeString();
    }
</script>

<ext:Button runat="server" Text="Click Me" Icon="Lightning">
    <Listeners>
        <Click Handler="Ext.net.DirectMethod.request(
            'GetTimeStamp3', 
            {
                success: function (result) { 
                    Ext.Msg.alert('Message', result); 
                } 
            });" />
    </Listeners>
</ext:Button>

  

7.將DirectMethod配置對象傳遞給代理功能

DirectMethod配置對象始終能夠做爲任何DirectMethod代理函數的最後一個參數傳遞。

<script runat="server">
    [DirectMethod]
    public string LogMessage(string msg)
    {
        // Log the message somewhere...
        return msg;
    }
</script>

<ext:Button ID="Button4" runat="server" Text="Click Me" Icon="Lightning">
    <Listeners>
        <Click Handler="Ext.net.DirectMethods.LogMessage('Hello World', {
                    success: function (result) { 
                        Ext.Msg.alert('Message', result); 
                    },
                    eventMask: {
                        showMask: true,
                        minDelay: 500
                    }
                });" />
    </Listeners>
</ext:Button>

將Click Listener添加到Button(或任何Ext.Net/Ext控件)

「監聽器」是客戶端事件處理程序。若是已配置監聽器,則事件處理程序將調用客戶端JavaScript函數。

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        // 1. 定義一個通用的JavaScript函數供之後使用
        string fn = "Ext.Msg.alert('Confirm', String.format('You Clicked {0}', this.id));";

        // 2. Click Listener from Code-Behind /在後置代碼裏給前端服務器控件添加監聽器
        this.Button2.Listeners.Click.Handler = fn;

        // 3. Click Listener using .On() method /使用on()方法添加點擊監聽器
        this.Button3.On("click", "function() {" + fn + "}");

        // 4. Click Listener using .AddListener() method /使用AddListener()方法添加點擊監聽器
        this.Button4.AddListener("click", "function() {" + fn + "}");

        // 11. Click Listener which only fires once (set from code-behind)
        this.Button11.Listeners.Click.Handler = fn;
        this.Button11.Listeners.Click.Single = true;

        // 12. Click Listener which only fires after 1.5 seconds (set from code-behind)
        this.Button12.Listeners.Click.Fn = "myCustomFn";
        this.Button12.Listeners.Click.Delay = 1500;
    }
</script>
    <form runat="server">
        <ext:ResourceManager runat="server">
            <Listeners>
                <DocumentReady Handler="this.Button5.on('click', function () { Ext.Msg.alert('Confirm', String.format('You Clicked {0}', this.id)); });" />
            </Listeners>
        </ext:ResourceManager>
        
        <script type="text/javascript">
            var myCustomFn = function () {
                Ext.Msg.alert('Confirm', String.format('You Clicked {0}', this.id));
            };
        </script>
    
        <h1>能夠給任何Ext.Net/Ext控件添加點擊監聽器</h1>
        
        <p>A "Listener" is a client-side event Handler. The event handler will call a client-side JavaScript function if the Listener has been configured.</p>

        <h2>1. 點擊監聽器 (在標記中設置)</h2>
        
            <ext:Button ID="Button1" runat="server" Text="Button #1">
                <Listeners>
                    <Click Handler="Ext.Msg.alert('Confirm', 'You Clicked Button1');" />
                </Listeners>
            </ext:Button>
        
        
       <h2>2. 從後置代碼code-behind裏添加點擊監聽器,在什麼的服務器端代碼裏</h2>
        
            <ext:Button ID="Button2" runat="server" Text="Button #2" />
        
        
        <h2>3. 使用 .On() 方法在後置代碼裏添加點擊監聽器</h2>
        
            <ext:Button ID="Button3" runat="server" Text="Button #3" />
        
        
       <h2>4. 使用 .AddListener() 方法添加點擊監聽器</h2>
        
            <ext:Button ID="Button4" runat="server" Text="Button #4" />
        
        
         <h2>5. 使用內連js添加點擊監聽器</h2>
        
            <ext:Button ID="Button5" runat="server" Text="Button #5" />
        
        
        <h2>6. 從另一個控件的狀態來添加點擊監聽器,點擊btnAddClick,給Button6添加一個點擊監聽器</h2>
        
            <ext:Button ID="btnAddClick" runat="server" Text="Add Click Listener to Button #6">
                <Listeners>
                    <Click Handler="Button6.on('click', function () {Ext.Msg.alert('Confirm', 'You Clicked the Button6')});" />
                </Listeners>
            </ext:Button>
            <br />
            <ext:Button ID="Button6" runat="server" Text="Button #6" />
        
            
        <h2>7. 添加點擊監聽器,並添加自定義js函數響應 (設置 "Handler" 屬性)</h2>
        
            <ext:Button ID="Button7" runat="server" Text="Button #7">
                <Listeners>
                    <Click Handler="={myCustomFn}" />
                </Listeners>
            </ext:Button>
        

        <h2>8.(set "Fn" Property)添加點擊監聽器,按自定義js函數名稱(設置Fn屬性)</h2>
        
            <ext:Button ID="Button8" runat="server" Text="Button #8">
                <Listeners>
                    <Click Fn="myCustomFn" />
                </Listeners>
            </ext:Button>
        
        
        <h2>9. 添加點擊監聽器,只觸發一次 (set in markup)</h2>
        
            <ext:Button ID="Button9" runat="server" Text="Button #9">
                <Listeners>
                    <Click Fn="myCustomFn" Single="true" />
                </Listeners>
            </ext:Button>
        

        <h2>10. 點擊觸發,在1.5秒後觸發(在標記裏設置)</h2>
        
            <ext:Button ID="Button10" runat="server" Text="Button #10">
                <Listeners>
                    <Click Fn="myCustomFn" Delay="1500" />
                </Listeners>
            </ext:Button>
        
            
        <h2>11. 點擊監聽器,只觸發一次(從後置代碼設置)</h2>
        
            <ext:Button ID="Button11" runat="server" Text="Button #11" />
        

        <h2>12. 點擊監聽器,僅在1.5秒後觸發(從後置代碼設置)</h2>
        
            <ext:Button ID="Button12" runat="server" Text="Button #12" />
        
    </form>  

關於Ext.NET 3種事件就結束了,要多加練習才能更加深入!  

相關文章
相關標籤/搜索