ASP.NET __doPostBack函數

參照:http://blog.csdn.net/libenqing/article/details/5812658

一、函數介紹:

      __doPostBack函數可以實現客戶端控件調用服務器端控件的響應。或者是在javascript裏面調用.net的服務器控件事件。這一點可以充分用在子窗口調用父窗口中某個服務器控件的服務器端的事件。
客戶端js利用__doPostBack(sender,args)函數來提交到服務器的方法:
__doPostBack(sender,args)
sender:提交的控件

args: 事件參數。一般賦空值。


二、函數觸發:

Asp.net中在客戶端觸發服務端事件分爲三種情況:
1. WebControls中的Button 和HtmlControls中的Type爲submit的HtmlInputButton
      這兩種按鈕最終到客戶端的表現形式爲: <input name="Submit1" id="Submit1" type="submit" value="Submit">,這是Form表單的提交按鈕,點擊以後會作爲參數發送到服務端,參數是這樣的: 控件的name屬性=控件的value值,對應上面的例子就是:Submit1= Submit。 服務端會根據接收到的控件的name屬性的這個key來得知是這個按鈕被點擊了,從而在服務端觸發這個按鈕的點擊事件。
2. WebControls中的ImageButton或者HtmlControls中的HttpInputImage
      這些控件到客戶端的表現類似這樣的: <input type="image" id="img1">,點擊了這樣的控件會直接提交表單,作用同提交按鈕。點擊了這樣的控件傳到服務端的參數是這樣的:id.x=nn&id.y=nn,對應到上面的例子就是:img1.x=nn&img1.y=nn
3.HtmlControls中的Type爲button的HtmlInputButton和其它所有的WebControls中的控件事件

      比如LinkButton點擊,TextBox的Change事件等等。


三、函數機制:

控件事件在客戶端產生後會經過一個統一的機制發送到服務端。
1.首先asp.net頁框架會使用兩個Hidden域來存放表示是哪個控件觸發的事件,以及事件的參數:
<!-表示觸發事件的控件,一般是這個控件的name -->
<input type="hidden" name="__EVENTTARGET" value="" />
<!-表示觸發事件的參數,一般是當某個控件有兩個以上的事件時,用來區別是哪個事件 -->
<input type="hidden" name="__EVENTARGUMENT" value="" />
2.服務端會生成一個js的方法來處理所有這些事件的發送,這段代碼是:
<mce:script language="javascript">
<!--
function __doPostBack(eventTarget, eventArgument) {
var theform = document.WebForm2;
theform.__EVENTTARGET.value = eventTarget;
theform.__EVENTARGUMENT.value = eventArgument;
theform.submit();
}
// -->
</mce:script>
3. 每個會引發服務端事件的控件都會在響應的客戶端事件中調用上面的代碼:
eg1:HtmlControls 中的 Type爲button的HtmlInputButton的點擊事件
<!-客戶端的點擊事件調用__doPostBack,eventTarget 參數爲'Button2',表示是name爲'Button2'控件觸發的事件,eventArgument 爲空,表示這個Type爲button的HtmlInputButton只有一個客戶端觸發的服務端事件-->
<input language="javascript" οnclick="__doPostBack('Button2','')" name="Button2" id="Button2" type="button" value="Button" />
eg2:TextBox控件的Change事件
<!-客戶端的onchange事件調用__doPostBack,eventTarget 參數爲'TextBox1',表示是name爲'TextBox1'控件觸發的事件,而TextBox控件只有一個客戶端觸發的服務端事件TextChanged,故服務器就會去觸發這個TextBox的TextChanged事件->
<input name="TextBox1" type="text" id="TextBox1" οnchange="__doPostBack('TextBox1','')" language="javascript" />

4. 客戶端觸發事件後調用__doPostBack方法,將表示觸發的控件源的eventTarget 和事件參數eventArgument分別付給兩個隱藏域__EVENTTARGET和__EVENTARGUMENT,然後提交Form,在服務端根據__EVENTTARGET和__EVENTARGUMENT來判斷是哪個控件的什麼事件觸發了。


四、函數具體內容:

瞭解了Asp.net 中服務端控件事件是如何觸發的後,我們再去認識__doPostback這個函數和它的作用。下面是__doPostback函數的具體內容:
<div>
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE4NDIzMDg2NDRkZMlHJoBQ9CYcWBtBK+zrfZzKoh/i" />
</div>
<mce:script type="text/javascript"><!--
...
<!--
var theForm = document.forms['form1'];
if (!theForm) ...{
    theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) ...{
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) ...{
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
// --></mce:script>
       其中eventTarget 和eventArgument,是兩個就是用來存儲在回送的時候獲取是哪個控件觸發了回送,並且帶了什麼參數。總之,調用__doPostBack函數可以實現客戶端控件調用服務器端控件的響應。或者是在javascript裏面調用.net的服務器控件事件(這也是我想要解決的問題)。這一點可以充分用在子窗口調用父窗口中某個服務器控件的服務器端的事件
eg:在我們寫程序的時候經常會需要動態的生成一些控件,最簡單的方法就是通過一個字符串,比如string strButton = <input type ="button" ID="button1">,然後輸出到頁面,但是如果我們需要這個控件來執行一些服務器的功能,就比較困難了。
        這裏我們就可以用過借用 __doPostBack這個函數來完成。以這個例子來說明一下具體如何調用。
        我們可以聲明一個不可見的LinkButton控件,那通常,我們希望一個控件不可見,通常都是把visible屬性設爲false。但是在這裏我們把LinkButton的Text屬性設置爲空,這樣這個LinkButton不可見(因爲當我們把visible屬性設置爲 false的時候,瀏覽器在解析的時候,根本不會把這個控件放在頁面上,也就是說這個控件是不存在的,所以我們在調用__doPostBack函數的時候,便會找不到控件 ),接下來我們可以在LinkButton裏面寫一些服務器端的代碼。然後就是如何通過我們動態生成的客戶端控件來調用LinkButton裏面的功能,我們可以通過一個JavaScript函數來實現
function ExcuteOnServer()
{
	//第一個參數是你希望提交到服務器的控件的ID號,第二個參數是事件參數
	__doPostBack('LinkButtonID','');
}

      接下去我們只需要在動態生成的這個Button控件的onclick事件中寫上οnclick="JavaScript:ExcuteOnServer();",這樣當我們點擊這個動態生成的客戶端控件的時候,他便會執行LinkButton中的代碼。這樣便實現了動態生成的客戶端控件提交到服務器端的功能。


五、注意:

1.__doPostBack函數名,很特別,他的前面有兩個下劃線;而且大小寫要區分好。__doPostBack= "_" + "_" + "doPostBack";
2.__doPostBack函數參數介紹:
     第一個參數__EVENTTARGET:是觸發事件的控件名;
     第二個參數__EVENTARGUMENT:是傳給控件的Value值。取值方法:string args = Request.Params.Get("__EVENTARGUMENT");
3.__doPostBack函數是DOTNET的服務器控件產生的。所以要使用此函數,必須整個頁面上至少要有一個控件可以回傳頁面。
eg:可以爲頁面添加一個LinkButton,因爲它本身就有這個屬性,或者可以添加其他控件,如DropDownList,但該控件AutoPostBack屬性應該定義爲true。
4.EnableEventValidation屬性要定義爲false,因爲它默認是true,否則無法回調。

eg:<%@ Page Language="C#" AutoEventWireup="true" Inherits="SJTSoft.JSTMBS.Web.Practitioner.Practitioner_Upload" EnableEventValidation="false" %>


六、實例:

1.前臺代碼:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="doPostBackTest.aspx.cs" Inherits="easuitest.WebForm1" EnableEventValidation="false" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head id="Head1" runat="server">  
    <title></title>  
</head>  
<body>  
    <form id="form1" runat="server">  
    <input οnclick="__doPostBack('Button1','左')" name="Buttonhtml" type="button" value="點擊調用後臺方法" />  
    <div>  
        <asp:Button ID="Button1" runat="server" Text="Button1" Visible="false" οnclick="Button1_Click"/>  
        <!--<asp:DropDownList ID="DropDownList1" AutoPostBack="true" runat="server"></asp:DropDownList>-->  
        <asp:LinkButton ID="LinkButton1" runat="server" Text = "" ></asp:LinkButton>  
    </div>  
    </form>  
</body>  
</html>  

2.後臺代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace easuitest
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
        
        protected void Button1_Click(object sender, EventArgs e)
        {
            string args = Request.Params.Get("__EVENTARGUMENT");
            Response.Write(args+"成功調用後臺方法!");
        }  
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章