2012-04-03 97 views
3

在回發期間,__EVENTTARGET表單變量包含發佈回發的name of the control。如果控件支持多個服務器端事件,ASP.NET如何知道該控件要觸發哪個事件?ASP.NET如何知道在回發期間觸發哪個事件?

+0

是你問你爲什麼要做它做的事情,或者你可以如何讓它起作用? – brizz 2012-04-03 07:57:05

+0

這些都不是。如果一個控件支持多個事件,asp.net如何知道要觸發哪一個?只需在__EVENTTARGET中傳遞控件ID是不夠的。 – 2012-04-03 08:07:34

回答

0

我猜,在其中持有值,在表單的數據傳遞控制的情況下,沒有任何疑點需要空間 - TextBox可以改變DropDownList可以有它的價值改變

事實上,這種控制通常只有一個事件從客戶端觸發,其他事件都是在服務器端的管道(DataBindingDataBoundInitLoad等)

另一方面,任何複合控​​件都可以使用__EVENTARGUMENTS向服務器提供附加參數,以便確定和分派實際事件。

5

正如Wiktor提到的,ASP.Net中的許多控件都已經爲您構建,以便以某種方式使用;按鈕點擊,文本更改,選定的索引更改 - 這些控件已建成做某些事情,which is why they work the way they do

從文檔:

因爲大多數ASP.NET服務器控件的事件需要往返於 服務器進行處理,它們會影響頁面的性能。因此,服務器控件提供了一組有限的事件,通常只有 點擊事件。某些服務器控件支持更改事件。例如,對於 示例,當用戶單擊該框時,CheckBox Web服務器控件會在服務器代碼中引發一個CheckedChanged事件 。某些服務器控件 支持更多抽象事件。例如,日曆Web服務器 控件引發了SelectionChanged事件,該事件是單擊事件的更抽象的 版本。

當然,您可以編寫自己的客戶端控件,但這需要更多的工作。文章Server Event Handling in ASP.Net對此進行了討論。總而言之,重要的部分是實現RaisePostBackEvent

如果你想提供多個事件,那麼你改變從客戶端發送到這個方法的事件參數,並引發相應的服務器端事件。這可以像if語句一樣簡單。一個基本的例子是有兩個客戶端JavaScript事件,其中的每一個可以稱之爲:

__doPostBack(controlId, 'superclick'); 

__doPostBack(pageId, 'superchange'); 

,然後在您的文章後面的事件處理程序,調用基於傳遞的參數所需要的服務器端事件。那麼一個簡單的RaisePostBackEvent服務器端的處理程序會看起來像:

public void RaisePostBackEvent(string eventArgument){ 

    if(eventArgument == "superclick") 
    { 
     OnSuperClick(this, new EventArgs()); 
    } 

    if(eventArgument == "superchange") 
    { 
     OnSuperChange(this, new EventArgs()); 
    }   

    } 
+0

RaisePostBackEvent包含兩個參數http://msdn.microsoft.com/en-us/library/system.web.ui.page.raisepostbackevent.aspx – Pankaj 2012-04-03 08:35:37

+0

@PankajGarg這就是Page.RaisePostBackEvent。請參閱答案中引用的http://msdn.microsoft.com/zh-CN/library/system.web.ui.ipostbackeventhandler.raisepostbackevent.aspx。或者,您可能很懶,只需在Page.Request.Params [「__ EVENTARGUMENT」]中查找回傳。 – dash 2012-04-03 08:37:14

0

如果你想在你的控制來處理回發事件,您將得到實現IPostBackEventHandler接口。該框架將調用接受eventArgument的IPostBackEventHandler.RaisePostBackEvent方法。根據事件參數,您可以提出各種其他自定義事件。

其他控制事件,如Init,Load等將被框架自動調用,而不管該控件是否可以處理回發事件。

1

要處理回發ASP.NET服務器控件必須實現IPostBackEventHandler接口。該接口有一個方法void RaisePostBackEvent(string eventArgument),它可以處理表單發佈到服務器時引發的事件。

此方法負責提高控件的服務器端事件。這裏唯一的參數是eventArgument,如果有必要(如GridView),用於區分事件類型

E.g. Button控制提高了ClickCommand事件。 GridView從事件參數參數中解析命令名稱,併爲命令觸發必要的事件。

你可以使用.NET反編譯器(我用這個很好的JetBrains dotPeek)來查看標準ASP.NET控件的RaisePostBackEvent方法的實現。

2

藉助HTTP嗅探器(如Fiddler)進行調試可以幫助您。大致上,事件詳情在__EVENTARGUMENT表格字段中。數據如何解壓縮是特定控件的實現細節。

例如,拖放一個TreeView到窗體上,並掛鉤其TreeNodeCollapsedTreeNodeExpanded,和SelectedNodeChanged事件。您將看到展開或摺疊一個節點導致在處發回一個類似於__EVENTARGUMENT的東西;而選擇節點會導致在__EVENTARGUMENT中發送類似snode_text的回傳。我的猜測是,t代表「切換」,s代表「選擇」,但我沒有挖到源檢查。 (順便說一下,只是說「切換」對於展開和摺疊都足夠好,因爲..._ExpandState表單變量保存了所有節點的展開狀態的詳細信息,它看起來像)。

相關問題