2010-08-23 79 views
1

如何檢查在頁面的Page_Load中單擊了哪個LinkButton。 這是爲了避免調用服務,以便它只執行其事件中存在的內容。如何驗證在Page_Load上在asp.net中單擊哪個LinkBut​​ton

+1

爲什麼它必須在page_load?爲什麼不爲每個鏈接按鈕設置不同的事件處理程序,並在該功能中進行處理? – Tommy 2010-08-23 20:23:24

+0

頁面加載執行與鏈接無關, – batwadi 2010-08-23 20:48:44

+3

對不起,但您的需求聽起來像是一個不良設計的解決方法。我會建議你閱讀關於asp.net的概念。凱爾西的答案是一個好的開始。 – Scordo 2010-08-23 21:25:49

回答

0

您的意思是說,您只是試圖在頁面上的其他回發事件觸發時保持Page_Load代碼不被執行?如果是這樣的話,把它包裝:

if (!IsPostBack) 

(恕我直言,這是一個有點被WebForms的事件模型必要一個黑客,但它是什麼。)

還是我誤解你的問題?

至於用於識別特定的LinkBut​​ton,你可以使用的CommandName參數:

http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.linkbutton.commandname.aspx

1

我以前要做到這一點,因爲在事件處理已經來不及了。你可以使用javascript來編寫被點擊到隱藏字段的按鈕的ID。比你可以在Page_Load中檢索它。如果我沒有記錯,其他方法是查看_EVENTTARGET隱藏字段,這是一段時間。

0

你也可以聲明一個LinkBut​​ton類型的變量(或者Control或者其他),並且讓按鈕在click事件中通過引用來更新它們,然後檢查Load的值。

7

您的Page_Load應該運行的唯一一件事是您希望始終發出每一個請求的代碼,或者讓您只需運行一次即可在運行後檢查中運行的代碼。例如:

protected void Page_Load(object sender, EventArgs e) 
{ 
    // Put the all code you need to run with EVERY request here 

    // Then add a post back check for any code you want to ONLY run on the very 
    // first request to the page. 
    if (!IsPostBack) 
    { 
     // Code you only want to run the first time. Usually setup code to initalize 
     // DropDownLists, Grids or pre populate a form, etc... 
    } 
} 

LinkButton代碼應該都在它自己的點擊處理程序:

protected void yourLinkButton_Click(object sender, EventArgs e) 
{ 
    // code you want to execute when your button is clicked. This will run AFTER 
    // the Page_Load has finished. 
} 

現在,如果你LinkButtonGridViewRepeater或某些類型的控制使用的需要結合要填寫它,那麼您可能需要實現一個RowCommand事件處理函數來確定哪個LinkButton被按下。您還可以將數據綁定到它的CommandArgument屬性,以將一些唯一的行特定數據傳遞給偶數處理程序。

如果你有一堆LinkButton都使用完全相同的處理程序,最壞的情況是投下sender,然後比較ID值。

protected void yourLinkButton_Click(object sender, EventArgs e) 
{ 
    LinkButton btn = (LinkButton)(sender); 
    if (btn.ID.Equals("Some control name you want to compare")) 
    { 
     // do something 
    } 
} 

如果我在你的問題上的標記,只是留下評論,我會嘗試和整理出來。

編輯:基於您的評論聽起來好像你必須知道它是在Page_Load由於一些其他方面的限制,其Button。那麼在Page_Load沒有乾淨的方式,但它可以完成。您需要檢查密鑰Request.Form並檢查特定的按鈕名稱(只有被點擊的Button應包含在密鑰中)。例如:

if (Request.Form.AllKeys.Contains("yourButton1")) 
{ 
    // then do something based on yourButton1 
} 
else if (Request.Form.AllKeys.Contains("yourButton2")) 
{ 
    // then do something based on yourButton2 
} 
// etc... 

我不認爲這是任何其他乾淨的方式來解決它。如果該框架包含導致在sender屬性之一中回發的控件,那本來就不錯。

另一個編輯:這完全滑了我的腦海。上面的編輯是你需要爲Button做的,因爲它沒有填充__EVENTTARGET。由於您使用的是LinkButton您可以使用以下方法來得到什麼控制引起後背部:

string controlNameThatCausedPostBack = Request.Form["__EVENTTARGET"]; 

我有一個LinkButton測試這和它的工作如預期。

。希望最終解決您的問題:)

+0

感謝Kelsey的詳細回答。我會以相同的方式實現..問題是在我的頁面我正在頁面加載和檢查一些隱藏字段值分頁......我知道它非常糟糕的設計,但它已經實施,所以不能改變它 – batwadi 2010-08-24 17:53:38

+0

@ prakash我已經更新了我的答案,希望包含一些應該讓你啓動並運行的代碼。讓我知道你是否需要更多的幫助。 – Kelsey 2010-08-24 18:24:22

+0

感謝您給予您Kelsey的時間,但問題是LinkBut​​ton不會出現在請求參數中,因爲我的知識只有按鈕id進入請求參數。請諮詢 – batwadi 2010-08-26 14:32:11

0

獨立處理方法是去這裏的方式,但你可以給每個按鈕的唯一ItemCommand財產,過濾那些是必要的。

1
protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsPostBack && Request.Form["__EVENTTARGET"] == LinkButton1.UniqueID) 
    { 
    // LinkButton1 was clicked 
    } 
} 
相關問題