程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> Request.Form中的一些特殊的東西

Request.Form中的一些特殊的東西

編輯:關於.NET

在page_load的時候怎麼知道是按了哪個按鈕?

一個form runat = server
裡面有很多button
bunton1,bunton2,bunton3...

我怎麼知道是點了哪個button返回的呢?
   
問題太模糊了,你用的是 服務端控件還是客戶端的呢?服務端的直接寫它的單擊事件就可以了。客戶端的就用JS。

服務器端的,我就是要在page_load的時候知道它接下來執行哪個函數。
我知道可以寫button的click事件

你是新新新手吧
page_load 是頁面夾暫時候執行的吧

按牛提交都回有自己的名字的。。。

按鈕的點擊事件屬於postback了,page_load只是頁面加載的時候激發的事件,我還是不明白你想要什麼,能不能貼點代碼上來看看

這麼說吧:
protected void Page_Load(object sender, EventArgs e)
{
//在這裡我有沒有可能得到接下來執行的哪個方法? 是btn1還是btn2,還是根本就不可能得到?
}
protected void btn1_Click(object sender, EventArgs e)
{
       
}
protected void btn2_Click(object sender, EventArgs e)
{
       
}

不可能
因為先是page_load事件之後,再執行按鈕中的click事件
既然page_load在先,那麼就不可能知道這以後要發生的事情


不可能
因為先是page_load事件之後,再執行按鈕中的click事件
既然page_load在先,那麼就不可能知道這以後要發生的事情 
那.Net本身是通過什麼機制來知道接下來發生的事情的呢?

那.Net本身是通過什麼機制來知道接下來發生的事情的呢? 
通過 EventArgs e,你只有按了以後會產生事件,這個時候能捕捉,你pageload的時候按鈕就沒按,誰會知道啊,你以為是神啊,所以你邏輯混亂關系混亂。先把net的事件,委托看明白了再來說問題。

pageload裡面有個Page.postback 樓主了解吧

你可以設置button的commandargs屬性
override protected void OnInit(EventArgs e)
    {
this.btn1.Command += new CommandEventHandler(this.DoBtnClick);
}
public virtual void DoBtnClick(object sender, CommandEventArgs e)
    {
string btn= e.CommandArgument.ToString();
switch(btn){}

}

我在7樓中說道:
不可能
因為先是page_load事件之後,再執行按鈕中的click事件
既然page_load在先,那麼就不可能知道這以後要發生的事情

然後樓主在8樓問道:
那.Net本身是通過什麼機制來知道接下來發生的事情的呢?
看到這個,我也很郁悶。。。但是不知道該如何回答。

突然在昨晚,我在調試的時候發現了Request.Form中的一些特殊的東西:Page.Request.Form["__EVENTTARGET"]

我覺得在Page_Load中確定當前的postback是由誰引起的,便不是難事了。
分析一下生成的Html源碼,發現linkbutton生成後是這樣的:

<a id="LinkButton1" href="Javascript:__doPostBack('LinkButton1','')">Button2</a>

而doPostBack的函數是這樣的:

function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}

在Form的隱藏標記還可以發現這些:

<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />

也就是說,linkbutton的id要提交到服務器端去,那在服務器端的Page_Load中不就可以確定是誰postback的了。

但是,Button和ImageButton在提交時,Page.Request.Form["__EVENTTARGET"]的值卻是空的。
不過,既然LinkButton提交時它的ID要提交到客戶端,那麼Button理應也該提交上去
Button的客戶端代碼是:

<input type="submit" name="Button1" value="Button1" id="Button1" />

也就是說,Button在提交時,其本身也是input標簽,提交表單時它自身當然也要提交上去了。

只要我們在Request.Form循環提交來的字符串,再用這個字符串FindControl就行了。
下面就是在page_load中尋找控件的函數。

    private string getPostBackControlName()
    {
        Control control=null;
        string ctrlname = Page.Request.Params["__EVENTTARGET"];
        if (ctrlname != null && ctrlname != String.Empty)
        {
            control = Page.FindControl(ctrlname);
        }
        else
        {
            Control c;
            foreach (string ctl in Page.Request.Form)
            {
                if (ctl.EndsWith(".x") || ctl.EndsWith(".y"))
                {
                    c = Page.FindControl(ctl.Substring(0, ctl.Length - 2));
                }
                else
                {
                    c = Page.FindControl(ctl);
                }
                if (c is System.Web.UI.WebControls.Button ||
                         c is System.Web.UI.WebControls.ImageButton)
                {
                    control = c;
                    break;
                }
            }
        }
        if (control != null)
            return control.ID;
        else
            return string.Empty;
    }

OK,暫時沒問題,但是,如果Button在GridVIEw、Repeater等控件中又會怎麼樣呢?

這得用過另一個了:Page.Request.Params["__EVENTARGUMENT"]

上面一個圖就是在GridVIEw中單了擊第二行中的“選擇”按鈕,所以提交到服務器的Page.Request.Params["__EVENTARGUMENT"]值為"Select$1",很明顯,如果單擊的是第一行,這個值應該為"Select$0"
所以在GridVIEw中的LinkButton的尋找是沒有問題的,那是不是Button、ImageButton與LinkButton有區別呢?
答案是 沒有。
因為LinkButton、Button和ImageButton都使用的是Javascript的__doPostBack
它們生成的Html標簽可能像下面這樣:

<a href="Javascript:__doPostBack('GridVIEw1','Edit$0')">編輯</a>
<input type="button" value="編輯" onclick="Javascript:__doPostBack('GridVIEw1','Edit$1')" />
<input type="image" src="" alt="編輯" onclick="Javascript:__doPostBack('GridVIEw1','Edit$1')" />

所以,結論

在Page_Load中,可以確定當前的POSTBACK是由誰引起的,而查找它們的方法就在上面的code的給出;
如果控件位於其它控件中,比如GridView、Repeater、DataList等等,就需要由Request.Params["__EVENTARGUMENT"]來幫助確定這個控件名,否則從Request.Form["__EVENTTARGET"]獲得的將會是GridVIEw1, Repeater1之類的數據控件的ID,而不是具體的引起POSTBACK的Button。

注:在寫的時候,我GG了一下,發現了已有一篇這樣的文章,於是,我參考了他的代碼,上面的代碼也稍稍作了些修改:
Get control name in Page_Load event which make the post back

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved