ASP.NET前臺使用__doPostBack函式呼叫後臺事件

kevin_god發表於2009-07-17

ASP.NET前臺使用__doPostBack函式呼叫後臺事件

這裡需要提一下的是,asp.net編 程提供了服務端控制元件和客戶端控制元件的說法,其實還是脫離不了HTML的本質,客戶端和服務端需要互動必須要提交,提交有兩種方式get和post,get就 是通過向服務端傳送連線地址,服務端通過地址的引數來獲得資訊的,一般這些引數都是明文,能在瀏覽器位址列看到。而post是通過表單的input等元素 提交到服務端的頁面的,這些資料一般是看不到的。asp.net的服務端控制元件其實就是對一般的HTML控制元件做了個包裝,大體是通過隱藏控制元件提供控制的引數的。

這裡介紹一個常用的函式_doPostBack,這個函式如果如果是ASP.Net render出來的頁面就是自動產生這個函式,比如有帶autopostback屬性的控制元件,且其屬性為true的頁面,帶列的datagrid頁面。
__doPostBack 是通過__EVENTTARGET,__EVENTARGUMENT兩個隱藏控制元件向服務端傳送控制資訊的,__EVENTTARGET為要呼叫控制元件的名 稱,如果要呼叫的控制元件是子控制元件,用''$'或':'分割父控制元件:子控制元件,__EVENTARGUMENT是呼叫事件時的引數

頁面的HTML裡找到客戶端Button,寫入

onclick="__doPostBack('Button1','')"

<script language="javascript">
<!--
    function __doPostBack(eventTarget, eventArgument) {
        var theform;
        if (window.navigator.appName.toLowerCase().indexOf("netscape") > -1) {
            theform. = document.forms["Form1"];
        }
        else {
            theform. = document.Form1;
        }
        theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
        theform.__EVENTARGUMENT.value = eventArgument;
        theform.submit();
    }
// --&gt

以及兩個隱藏控制元件


值得注意的是,_doPostPack的第一個引數是大小寫不敏感的。細心的人會發現,在__doPostBack裡,提交呼叫的是 theform.submit(),這樣就導致對Form的onsubmit事件校驗失效了,幸好這個問題在asp.net 2.0已經修復了。這裡提供一個替換的解決辦法,在Form的最下面插入下面的程式碼,這段程式碼在保證不管是不是render出來的頁面均有效


<!--
    function __doPostBack_Ex(eventTarget, eventArgument)
    {
        var theform;

        if (window.navigator.appName.toLowerCase().indexOf("netscape") > -1) {
            theform. = document.forms[0];
        }
        else {
            theform. = document.forms[0];
        }

        if(!theform.__EVENTTARGET)
        {           
            theform.appendChild(document.createElement(""));
        }

        if(!theform.__EVENTARGUMENT)
        {           
            theform.appendChild(document.createElement(""));                       
        }

        theform.__EVENTTARGET.value = eventTarget.split("$").join(":");
        theform.__EVENTARGUMENT.value = eventArgument;

        if ((typeof(theform.onsubmit) == "function"))
        {
            if(theform.onsubmit()!=false)
            {
                theform.submit();   
            }
        }
        else
        {           
            theform.submit();   
        }

        function __doPostBack(eventTarget, eventArgument)
        {
            __doPostBack_Ex(eventTarget, eventArgument);
        }
    }
// --&gt

示例:

前臺:

class="tb_linkbtn" id="lbtnReturn" href="javascript.:__doPostBack('lbtnTest','')">測試

後臺:

if(Request["__EVENTTARGET" ]=="lbtnTes")
{
    Response.Write("連結點選的PostBack");
}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17140602/viewspace-609490/,如需轉載,請註明出處,否則將追究法律責任。

相關文章