在回发期间,__EVENTTARGET
表单变量包含发出回发的name of the control
。如果控件支持多个服务器端事件,ASP.NET如何知道为该控件触发哪个事件?
答案 0 :(得分:5)
正如Wiktor所提到的,ASP.Net中的许多控件已经为您构建,可以在某些方面使用;按钮单击,文本更改,所选索引已更改 - 这些控件已构建为执行某些操作which is why they work the way they do。
来自文档:
因为大多数ASP.NET服务器控件事件都需要往返 服务器进行处理时,它们会影响页面的性能。 因此,服务器控件通常只提供有限的事件集 点击类型事件。某些服务器控件支持更改事件。对于 例如,CheckBox Web服务器控件引发CheckedChanged事件 在用户单击该框时的服务器代码中。一些服务器控件 支持更抽象的事件。例如,Calendar Web服务器 control引发一个更抽象的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());
}
}
答案 1 :(得分:2)
借助于Fiddler之类的HTTP嗅探器进行调试可以在这里提供帮助。从广义上讲,事件详情位于__EVENTARGUMENT
表单字段中。如何解压缩数据是特定控件的实现细节。
例如,将TreeView
放到表单上,然后连接其TreeNodeCollapsed
,TreeNodeExpanded
和SelectedNodeChanged
个事件。您将看到展开或折叠节点会导致tnode_text
中__EVENTARGUMENT
之类的内容回传;而选择一个节点会导致snode_text
中的__EVENTARGUMENT
回复。我的猜测是t
代表“切换”,s
代表“选择”,但我没有挖掘来源进行检查。
(顺便说一句,只是说“切换”对于展开和折叠都足够好,因为..._ExpandState
表单变量包含所有节点的展开状态的详细信息,它看起来像。)
答案 2 :(得分:1)
要处理回发,ASP.NET服务器控件必须实现IPostBackEventHandler
接口。此接口具有单个方法void RaisePostBackEvent(string eventArgument)
,该方法处理将表单发布到服务器时引发的事件。
此方法负责引发控件的服务器端事件。这里唯一的参数是eventArgument
,用于在必要时区分事件类型(如GridView
)。
E.g。 Button
控件会引发Click
和Command
个事件。 GridView
从event参数中解析命令名,并为该命令触发必要的事件。
您可以使用.NET反编译器(我使用优秀的JetBrains dotPeek)来查看标准ASP.NET控件的RaisePostBackEvent
方法的实现。
答案 3 :(得分:0)
我想如果控件中包含单个值,传入表单的数据,则无需担心任何疑问 - TextBox
可以更改,DropDownList
可以将其值更改等
实际上,此类控件通常只有一个事件从客户端触发,其他事件用于服务器端管道(DataBinding
,DataBound
,Init
,{{1}等等。)
另一方面,任何复合控件都可以使用Load
向服务器提供其他参数,以便确定和分派实际事件。
答案 4 :(得分:0)
如果您想在控件中处理回发事件,那么您将实现IPostBackEventHandler接口。该框架将调用接受eventArgument的IPostBackEventHandler.RaisePostBackEvent方法。根据事件参数,您可以引发各种其他自定义事件。
框架会自动调用其他控制事件,如Init,Load等,无论控件是否可以处理回发事件。