ASP.NET如何知道在回发期间要触发哪个事件?

时间:2012-04-03 07:44:27

标签: asp.net webforms

在回发期间,__EVENTTARGET表单变量包含发出回发的name of the control。如果控件支持多个服务器端事件,ASP.NET如何知道为该控件触发哪个事件?

5 个答案:

答案 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放到表单上,然后连接其TreeNodeCollapsedTreeNodeExpandedSelectedNodeChanged个事件。您将看到展开或折叠节点会导致tnode_text__EVENTARGUMENT之类的内容回传;而选择一个节点会导致snode_text中的__EVENTARGUMENT回复。我的猜测是t代表“切换”,s代表“选择”,但我没有挖掘来源进行检查。

(顺便说一句,只是说“切换”对于展开和折叠都足够好,因为..._ExpandState表单变量包含所有节点的展开状态的详细信息,它看起来像。)

答案 2 :(得分:1)

要处理回发,ASP.NET服务器控件必须实现IPostBackEventHandler接口。此接口具有单个方法void RaisePostBackEvent(string eventArgument),该方法处理将表单发布到服务器时引发的事件。

此方法负责引发控件的服务器端事件。这里唯一的参数是eventArgument ,用于在必要时区分事件类型(如GridView)。

E.g。 Button控件会引发ClickCommand个事件。 GridView从event参数中解析命令名,并为该命令触发必要的事件。

您可以使用.NET反编译器(我使用优秀的JetBrains dotPeek)来查看标准ASP.NET控件的RaisePostBackEvent方法的实现。

答案 3 :(得分:0)

我想如果控件中包含单个值,传入表单的数据,则无需担心任何疑问 - TextBox可以更改DropDownList可以将其值更改

实际上,此类控件通常只有一个事件从客户端触发,其他事件用于服务器端管道(DataBindingDataBoundInit,{{1}等等。)

另一方面,任何复合控​​件都可以使用Load向服务器提供其他参数,以便确定和分派实际事件。

答案 4 :(得分:0)

如果您想在控件中处理回发事件,那么您将实现IPostBackEventHandler接口。该框架将调用接受eventArgument的IPostBackEventHandler.RaisePostBackEvent方法。根据事件参数,您可以引发各种其他自定义事件。

框架会自动调用其他控制事件,如Init,Load等,无论控件是否可以处理回发事件。