在后台回发期间,__EVENTTARGET
表单变量保存了发起回发的控件名称
。如果该控件支持多个服务器端事件,ASP.NET如何知道为该控件触发哪个事件?
__doPostBack(controlId, 'superclick');
__doPostBack(pageId, 'superchange');
public void RaisePostBackEvent(string eventArgument){
if(eventArgument == "superclick")
{
OnSuperClick(this, new EventArgs());
}
if(eventArgument == "superchange")
{
OnSuperChange(this, new EventArgs());
}
}
__EVENTARGUMENT
表单字段中。如何解包这些数据是特定控件的实现细节。TreeView
,并连接其TreeNodeCollapsed
、TreeNodeExpanded
和SelectedNodeChanged
事件。您会发现展开或折叠节点会导致一个带有类似于tnode_text
的内容在__EVENTARGUMENT
中的后台提交;而选择节点会导致一个带有类似于snode_text
的内容在__EVENTARGUMENT
中的后台提交。我猜t
代表"toggle",s
代表"select",但我没有深入源代码进行确认。..._ExpandState
表单变量保存了所有节点的展开状态详细信息,看起来是这样的。)IPostBackEventHandler
接口。该接口有一个单一的方法void RaisePostBackEvent(string eventArgument)
,用于处理当表单提交到服务器时引发的事件。eventArgument
,如果需要(如GridView
),它用于区分事件类型。Button
控件会引发Click
和Command
事件。GridView
从事件参数中解析出命令名称,并为命令触发必要的事件。RaisePostBackEvent
方法的实现。我猜在控件只保存一个值的情况下,传递表单数据时不需要任何疑虑——TextBox
可以被更改,DropDownList
的值也可以被更改。
事实上,这些控件通常只有一个事件从客户端触发,其他事件都是为服务器端管道服务的(DataBinding
、DataBound
、Init
、Load
等)。
另一方面,任何复合控件都可以使用__EVENTARGUMENTS
向服务器提供附加参数,以便确定和分派实际事件。