在回發期間,__EVENTTARGET
表單變量包含發佈回發的name of the control
。如果控件支持多個服務器端事件,ASP.NET如何知道該控件要觸發哪個事件?ASP.NET如何知道在回發期間觸發哪個事件?
回答
我猜,在其中持有單值,在表單的數據傳遞控制的情況下,沒有任何疑點需要空間 - TextBox
可以改變,DropDownList
可以有它的價值改變等
事實上,這種控制通常只有一個事件從客戶端觸發,其他事件都是在服務器端的管道(DataBinding
,DataBound
,Init
,Load
等)
另一方面,任何複合控件都可以使用__EVENTARGUMENTS
向服務器提供附加參數,以便確定和分派實際事件。
正如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());
}
}
RaisePostBackEvent包含兩個參數http://msdn.microsoft.com/en-us/library/system.web.ui.page.raisepostbackevent.aspx – Pankaj 2012-04-03 08:35:37
@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
如果你想在你的控制來處理回發事件,您將得到實現IPostBackEventHandler接口。該框架將調用接受eventArgument的IPostBackEventHandler.RaisePostBackEvent方法。根據事件參數,您可以提出各種其他自定義事件。
其他控制事件,如Init,Load等將被框架自動調用,而不管該控件是否可以處理回發事件。
要處理回發ASP.NET服務器控件必須實現IPostBackEventHandler
接口。該接口有一個方法void RaisePostBackEvent(string eventArgument)
,它可以處理表單發佈到服務器時引發的事件。
此方法負責提高控件的服務器端事件。這裏唯一的參數是eventArgument
,如果有必要(如GridView
),用於區分事件類型。
E.g. Button
控制提高了Click
和Command
事件。 GridView
從事件參數參數中解析命令名稱,併爲命令觸發必要的事件。
你可以使用.NET反編譯器(我用這個很好的JetBrains dotPeek)來查看標準ASP.NET控件的RaisePostBackEvent
方法的實現。
藉助HTTP嗅探器(如Fiddler)進行調試可以幫助您。大致上,事件詳情在__EVENTARGUMENT
表格字段中。數據如何解壓縮是特定控件的實現細節。
例如,拖放一個TreeView
到窗體上,並掛鉤其TreeNodeCollapsed
,TreeNodeExpanded
,和SelectedNodeChanged
事件。您將看到展開或摺疊一個節點導致在處發回一個類似於__EVENTARGUMENT
的東西;而選擇節點會導致在__EVENTARGUMENT
中發送類似snode_text
的回傳。我的猜測是,t
代表「切換」,s
代表「選擇」,但我沒有挖到源檢查。 (順便說一下,只是說「切換」對於展開和摺疊都足夠好,因爲..._ExpandState
表單變量保存了所有節點的展開狀態的詳細信息,它看起來像)。
- 1. 如何知道哪個ace編輯器觸發了'onchange'事件?
- 2. 如何知道哪個頁面觸發了Session Start事件?
- 3. ASP.NET Mvc:如何在日期之後觸發通知事件?
- 4. 我怎麼知道哪個元素從js觸發事件?
- 5. 多個更新面板:如何知道哪一個觸發回發
- 6. 我想知道哪些表存儲事件觸發如
- 7. 不知道爲什麼觸發事件觸發兩次
- 8. 哪些ASP.NET生命週期事件在HttpApplication.Error之後觸發?
- 9. 觸發事件()如預期
- 10. MySQL觸發器:如何知道哪個腳本調用它?
- 11. ASP.NET控件事件處理程序在回發時未觸發?
- 12. 如何知道觸發事件的操作?
- 13. 如何知道在重命名期間哪個文件失敗?
- 14. 間接觸發UI的觸發事件
- 15. 每次在ASP.NET中觸發哪個事件
- 16. 如何停止觸發事件+ ASP.NET
- 17. 如何在'blur'事件觸發前觸發'submit'事件?
- 18. ASP.NET Click()事件在第二次回發時不會觸發
- 19. 如何知道什麼時候在某個元素上觸發按鍵事件
- 20. asp.net如何知道發生了什麼事件?
- 21. ASP.Net Session_Start事件未觸發
- 22. Winforms:哪個事件觸發? combobox.selectedindexchanged OR bindingsource.currentchanged
- 23. 如何確定哪個控件觸發了一個事件?
- 24. 我將如何得到由JS觸發routeChangeStart事件事件知道或單擊
- 25. 如何判斷哪個FloatSpin在wxPython中觸發EVT_FLOATSPIN事件?
- 26. 在期間觸發器觸發
- 27. 事件觸發文件上傳在asp.net
- 28. 在回發期間或初始請求期間的ASP.NET事件順序
- 29. 如何知道@RequestMapping觸發的時刻?
- 30. 如何在第一次自動觸發事件後觸發第二個事件
是你問你爲什麼要做它做的事情,或者你可以如何讓它起作用? – brizz 2012-04-03 07:57:05
這些都不是。如果一個控件支持多個事件,asp.net如何知道要觸發哪一個?只需在__EVENTTARGET中傳遞控件ID是不夠的。 – 2012-04-03 08:07:34