2011-04-08 27 views
1

我目前正在開發一個使用ASP.NET 3.5的網站。在頁面上有一些情況我不希望特定的控件會導致回發到服務器。我寫了一個函數來返回false,如果滿足這個條件,當onsubmit事件發生時會被調用。但我不知何故需要確定哪個控件會導致回發,因爲只有在特定控件在特定條件下導致回發時才應該取消回發。如何做到這一點?JavaScript:確定哪個控件導致回發

謝謝你的時間。

回答

2

參見:

如何ASP.NET識別負責處理回發的控制 ? 當 請求體中沒有引用的控件實現接口時,頁類會查找隱藏字段(如果有)。 該字段的內容被假定爲 的ID的引起回發的控制。 如果此控件實現接口,則會調用 RaisePostbackEvent方法。

這是從這裏 - The Client Side of ASP.NET Pages

所以在客戶端__EVENTTARGET是你所需要的。在服務器端,你既可以重寫Page.RaisePostBackEvent方法(這是受保護的方法,這樣你就可以從System.Web.UI.Page類繼承):

protected override void RaisePostBackEvent(IPostBackEventHandler sourceControl, 
              string eventArgument) 
{ 
    // sourceControl is a control that caused postback 
    base.RaisePostBackEvent(sourceControl, eventArgument); 
} 

或不inherining執行相同的:

var controlName = page.Request.Params["__EVENTTARGET"]; 
Control postbackControl = null; 
if (!string.IsnullOrEmpty(controlName)) 
{ 
    postbackControl = this.Page.FindControl(controlName); 
} 

編輯:關於作者對我的回答的評論:如果__EVENTTARGET值是一個空字符串,看起來你已經在__doPostBack函數中設置了該值。所以解決方法可能在覆蓋__doPostBack功能或類似的方式;你可以在這個SO quesion找到一個例子。

+0

你好,查詢導致在服務器端回發的控件會太晚了,因爲我想防止回發。所以我試圖獲取處理事件_onsubmit_的隱藏字段___EVENTTARGET_的值,但其值始終是空字符串。 – chrinetr 2011-04-09 19:01:33

+0

@Pratzelwurm,更新了我的回答 – Alex 2011-04-09 20:17:32

+0

謝謝。你提供的鏈接幫了我很多:) – chrinetr 2011-04-12 18:31:21

0

您可能可以使用ScriptManager.GetCurrent().AsyncPostBackSourceElementID來找到導致回發到頁面的控件。在MSDN

更多細節,但它會在這些情況下工作:

  • 從是 UpdatePanel控件,其 ChildrenAsTriggers屬性設置爲 true(默認值)內的控制回發。

  • 作爲UpdatePanel控件的觸發器的控件的回發。

  • 通過調用ScriptManager控件的 RegisterAsyncPostBackControl方法 註冊的控件的回發。

我不知道,如果你使用的UpdatePanel,但它似乎有可能,因爲這是我能想到的,你就需要知道哪些控制導致回發的唯一情況。

+0

你好,我不使用更新面板。我的情況是我的頁面上有一個DropDownList。每次選擇另一個項目時都會導致回發。如果選擇列表中的第一個值是因爲它是無效條目(僅供參考),並且選擇了一個值但已顯示相關信息,我想阻止該回發。 – chrinetr 2011-04-09 19:07:33

相關問題