熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP.NET中的事件處理

2013-11-13 10:09:13  來源: .NET編程 

  一ASPNET中的事件主要支持個主要的事件組

  包含在生成頁面時自動生成我們使用這些事件建立頁面(如page_load等)

  包含了用戶與頁面交互時發生的所有事件(這種最強大)

  html內部的事件這些事件在浏覽器上執行(主要是由javascript來實現)

  在C#語言中事件的處理主要有兩種方法

  委托式事件處理模式(Delegation Event Model)   (VS中需要手工建立事件的委托關系VS不需要了

  對可重載方法(Event Method)的重載  (在控件代碼中重載方法)

  二ASPNET服務端添加客戶端事件

  服務器控件並不是所有的操作都是在服務器端執行的有的事件是通過客戶端腳本來執行的這樣可以大大增強服務器控件的可用性如ASPNET驗證控件可以把部分工作放在客戶端進行驗證

  ASPNET服務器控件可以發送兩種客戶端腳本

  客戶端腳本塊客戶端腳本塊通常是用JavaScript編寫的其中通常包含在發生特定的客戶端事件時執行的函數

  發送腳本塊的方法是使用SystemWebUIPage類包含的兩個方法可以將客戶端代碼發送到由ASPNET Web頁面提供的HTML中

  (RegisterStartupScript(keyscript)在Web窗體的結尾處(在</form> 標記之前)發送腳本塊

  (RegisterClientScriptBlock(keyscript):在Web窗體的開始處(緊接著<form runat=server>標識之後)發送腳本塊

  如                  protected override void OnPreRender(EventArgs e)
                        {
                    if (!PageClientScriptIsClientScriptBlockRegistered(Common))
                    {
                        PageClientScriptRegisterClientScriptBlock(typeof(Page) Common ClientJavaScriptCodeScipt(Commonjs));
                    }
                    if (!PageClientScriptIsClientScriptBlockRegistered(ScriptKey))
                    {
                        PageClientScriptRegisterClientScriptBlock(typeof(Page) ScriptKey ClientJavaScriptCodeScipt(DateTimejs));
                    }
                        }
        客戶端HTML屬性客戶端HTML屬性提供將客戶端事件與客戶端腳本聯系在一起的方法

  這種方法只適用於從SystemWebUIWebControlsWebControl類導出的服務器控件因為從這個類導出的控件會發送某些HTML元素

  WebControl類包含一個將HTML元素屬性添加到由Web控件發出的HTML元素的方法該方法稱為AddAttributesToRender()它只有一個輸入參數即HtmlTextWriter的實例

  當然在現在開發控件中也沒必要通過這種方式來為HTML元素添加事件特別在采用AJAX模式的情況下完全可以在客戶端通過$addHandler來為HTML元素綁定事件          /// <summary>
        /// 將此控件呈現給指定的輸出參數
        /// </summary>
        /// <param name=output> 要寫出到的HTML 編寫器</param>
        protected override void AddAttributesToRender(HtmlTextWriter output)
        {
        outputAddAttribute(onmousedownsetday(this););
        outputAddAttribute(onkeypress EnsureNumeric(event));
        baseAddAttributesToRender(output);
        }
        下面的例子說明了ASPNET服務端如何添加客戶端事件          using System;
        using SystemData;
        using SystemConfiguration;
        using SystemCollections;
        using SystemWeb;
        using SystemWebSecurity;
        using SystemWebUI;
        using SystemWebUIWebControls;
        using SystemWebUIWebControlsWebParts;
        using SystemWebUIHtmlControls;
        namespace ServerToClientScript
        {
            public partial class _Default : SystemWebUIPage
            {
                protected void Page_Load(object sender EventArgs e)
                {
                    string script = return confirm(真的要刪除嗎?);;
                    thisButtonAttributesAdd(onclickscript);
                    if ((!PageIsStartupScriptRegistered(PopUp)&&(!PageIsPostBack)))
                    {
                        string scriptBlock = <script language=JavaScript>alert(發送客戶端腳本!);</script>;
                        PageRegisterStartupScript(PopUpscriptBlock);
                    }
                }
            }
        }

  三通過客戶端事件引發服務端事件

  其實服務端控件的服務端事件是通過客戶端的JavaScript模擬出來的如我在頁面上添加了一個服務器控件DropDownList並設置其AutoPostBack為True然後設置它的 SelectedIndexChanged事件          protected void DropDownList_SelectedIndexChanged(object sender EventArgs e)
        {
        }

  運行頁面後發現HTML代碼為可以看出服務端SelectedIndexChanged事件模擬成JavaScript中的onchange事件

  

  <!DOCTYPE html PUBLIC //WC//DTD XHTML Transitional//EN

  transitionaldtd>
        <html xmlns= >
        <head><title>
        無標題頁
        </title></head>
        <body>
            <form name=form method=post action=MNEventaspx id=form>
        <div>
        <input type=hidden name=__EVENTTARGET id=__EVENTTARGET value= />
        <input type=hidden name=__EVENTARGUMENT id=__EVENTARGUMENT value= />
        <input type=hidden name=__LASTFOCUS id=__LASTFOCUS value= />
        <input type=hidden name=__VIEWSTATE id=__VIEWSTATE value=/wEPDwULLTEODIMjgzNjcPZBYCAgMPZBYCAgEPEGRkFgFmZGSYTeyILmYps

  yPH/GyUwiYstw== />
        </div>
        <script type=text/javascript>
        <!
        var theForm = documentforms[form];
        if (!theForm) {
            theForm = documentform;
        }
        function __doPostBack(eventTarget eventArgument) {
            if (!theFormonsubmit || (theFormonsubmit() != false)) {
                theForm__EVENTTARGETvalue = eventTarget;
                theForm__EVENTARGUMENTvalue = eventArgument;
                theFormsubmit();
            }
        }
        // >
        </script>
            <div>
                <select name=DropDownList onchange=javascript:setTimeout(__doPostBack(\DropDownList\\\) ) id=DropDownList>
                <option selected=selected value=>男</option>
                <option value=>女</option>
        </select></div>
        <div>
                <input type=hidden name=__EVENTVALIDATION id=__EVENTVALIDATION value=/wEWBALgifCwDwKdI/lCgKUaSLBgLQuaSLBtnpaAhgqUhPSsiGZsieadh />
        </div></form>
        </body>
        </html>
        </html>

  既然服務器端控件的事件是通過客戶端的JavaScript模擬出來那麼我們就可以通過客戶端事件來引發服務器事件

  在控件開發中控件的服務端事件就是通過客戶端的JavaScript模擬出來的(__doPostBack)

  如例子ClientToServerEvent(附件中有代碼)

  通過DropDownList的onchange客戶端事件來引發服務端控件Button的服務端事件Click事件          using System;
        using SystemData;
        using SystemConfiguration;
        using SystemCollections;
        using SystemWeb;
        using SystemWebSecurity;
        using SystemWebUI;
        using SystemWebUIWebControls;
        using SystemWebUIWebControlsWebParts;
        using SystemWebUIHtmlControls;
        namespace ServerToClientScript
        {
            public partial class ClientToServerEvent : SystemWebUIPage
            {
                protected void Page_Load(object sender EventArgs e)
                {
                    string strCMD = PageGetPostBackClientHyperlink(Button);
                    string script = @Javacript:ConfirmUpdate(EVAL_MESSAGE);;
                    script = scriptReplace(EVAL_MESSAGE strCMD);
                    DropDownListAttributesAdd(onchangescript);
                }
                protected void Button_Click(object sender EventArgs e)
                {
                    ResponseWrite(我從服務器來已經保存!);
                }
            }
        }

  在頁面上寫JavaScript腳本

                <script type=text/javascript>
                function ConfirmUpdate(cmd)
                {
                    if(confirm(真的要保存嗎?))
                    {
                        eval(cmd);  //eval函數調用一個字符串中包含的命令
                    }
                    else
                    {
                        alert(我來自客戶端已經取消!);
                    }
                }
            </script>

  這樣當我的DropDownList選項改變時觸發onchange客戶端事件然後由該事件引發Button服務端事件

  四ASPNET事件模型機制

  ASPNET之所以對於以前的ASP是一個革命性的巨變在很大程度上是由於ASPNET技術是一種基於事件驅動的全新技術

  在ASPNET中時間的觸發和處理是在客戶端和服務端進行的

  ASPNET中如果頻繁和服務器進行事件信息傳遞會大大降低服務器的處理效率和性能因而有些事件如OnMouseOver沒有提供

  但提供了Change事件為了提高效率它們被緩存在客戶端等到再一次事件信息被發送到服務器端時一同發送回去

  如文本框的change事件下拉框的change事件

  如兩個控件的change事件中          protected void DropDownList_SelectedIndexChanged(object sender EventArgs e)
        {
            ResponseWrite(DropDownList控件選擇改變!<br>);
        }
        protected void TextBox_TextChanged(object sender EventArgs e)
        {
            ResponseWrite(TextBox文本改變!<br>);
        }

  如果控件本身的AutoPostBack設置為false(默認是false)時文本框和下拉框發生

  改變時不會執行change事件的而是將事件信息緩存在客戶端

  當在頁面上點擊一個服務器端控件Button          protected void Button_Click(object sender SystemEventArgs e)
        {
            ResponseWrite(點擊了Button按鈕!<br>);
        }

  此時將客戶端中的事件信息發送到服務器端執行所有的事件返回到客戶端的信息為

  TextBox文本改變!

  DropDownList控件選擇改變!

  點擊了Button按鈕!


From:http://tw.wingwit.com/Article/program/net/201311/12713.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.