我知道viewstate和dopostback和所有东西,我只是不知道引发事件的引用在哪里。说,button1.click被触发,然后当页面通过回发循环,然后page.load被执行,然后引发的事件必须执行,但asp.net如何知道它是哪个事件?asp.net如何知道发生了什么事件?
回答
贴有要求,当你点击一个按钮,例如即发的内容,包含了引发事件的控件的名称。在下文中,我使用了HTTP Headers阅读器工具,该工具显示通过HTTP请求发送的信息,并通过单击Web窗体上的两个按钮来检查发送的请求。每个请求在内容下的发布数据中为Button =设置不同的值。
http://localhost:1182/Pages/NewFolder1/WebForm1.aspx
POST /Pages/NewFolder1/WebForm1.aspx HTTP/1.1
Host: localhost:1182
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 548
__VIEWSTATE=viewstateblahblah&__EVENTVALIDATION=eventblahblah&**Button2=Button**
[..omitted parts for brevity..]
----------------------------------------------------------
http://localhost:1182/Pages/NewFolder1/WebForm1.aspx
POST /Pages/NewFolder1/WebForm1.aspx HTTP/1.1
Host: localhost:1182
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 548
__VIEWSTATE=blah blah state&__EVENTVALIDATION=viewstateblahblah&**Button1=Button**
[..omitted parts for brevity..]
----------------------------------------------------------
更新:为了增加我的回答,考虑到被发送到服务器时,两个事件在同一时间(发送到服务器的以下内容如Button.Click和 一个ComboBox.SelectedIndexChanged )。 _ VIEWSTATE =视图状态加密等等等等& _EVENTVALIDATION =事件验证加密等等等等& DropDownList1 =三个& Button1的=按钮
所以形式构建的方式,事件信息被添加到作为HTTP请求发布到服务器。这些参数包含提升事件的控件的名称,我认为所有这些都在__EVENTVALIDATION参数中加密,以确保在引发的事件和引发它们的控件中不会发生篡改。它就像事件信息的散列一样。
您必须阅读ASP.NET的页面生命周期以了解如何引发asp.net中的事件?看看这篇文章 - Events in the Page Life Cycle.
在回发中引发事件的控件必须实现IPostBackEventHandler
并定义方法RaisePostBackEvent()。该页面将尝试使用其ID来查找控件,否则,您必须将控件注册为需要使用RegisterRequiresRaiseEvent
的事件。
你可以阅读更多关于这个在:
有隐藏字段,这些隐藏字段包含被点击的控制,以及各种事件参数,这些参数被发回到表单中,然后在服务器端进行解码。
阅读:
+1我的回答补充了这一点。 – Mzn 2012-01-30 01:49:01
它只是HTML!
每个ASP.NET控件都呈现为HTML。按钮在<form>
元素内呈现HTML <input name="button1" type="submit" />
。点击按钮后,Web浏览器将表单提交到回发URL以及所有表单变量。其中一个变量是“button1”,它告诉ASP.NET单击了button1,并且ASP.NET触发了button1.Click
事件。
请注意:用户的Web浏览器中没有涉及ASP.NET魔术。单击ASP.NET页面上的按钮与PHP或ColdFusion页面上的按钮没有区别。浏览器端的所有内容都只是HTML。浏览器只需将表单提交给ASP.NET(或PHP或ColdFusion)接收请求的服务器,并通过表单变量确定哪些表单元素发生了更改和/或哪个按钮被点击了。
玩这个平凡的HTML按钮演示页,查看HTML按钮的工作原理: http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_form_submit
ASP.NET活动
为了保持short--当你设计你的网页在Visual Studio中,有没有什么地方是将您的点击处理程序注册到button1.Click
事件的一行代码。它看起来像这样:Button1.Click += new EventHandler(this.GreetingBtn_Click);
。如果您的网页使用AutoEventWireup
,那么此代码会自动生成。无论哪种方式,当ASP.NET获得包含button1的HTML表单发布时,它知道发起button1.Click
事件。您的事件处理程序被调用,因为它是按上述方式预先注册的,它将对事件处理程序方法的引用存储在列表中。每个事件都有一个当事件被触发时调用的方法列表。您可以为一个事件注册多个处理程序。当事件被触发时,每个预先注册的方法都会被调用。
- 1. WPF - 如何知道引发了什么ComboBox_SelectionChanged事件
- 2. 不知道发生了什么 - C
- 3. 有没有人知道javaspec.org发生了什么事?
- 4. 我不知道终端发生了什么事
- 5. 发生了什么事filterContext.Cancel(ASP.NET MVC)
- 6. ifilter发生了什么事?
- 7. ICryptoTransform.TransformBlock:发生了什么事?
- 8. WebRequest.GetResponse().....发生了什么事?
- 9. xmoov发生了什么事?
- 10. php_mysql.dll发生了什么事?
- 11. ASP.NET如何知道在回发期间触发哪个事件?
- 12. 如何知道哪个用户生成了Firebase事件?
- 13. 我们怎么知道在VBnet的picturebox里触发了什么事件
- 14. 查询性能;不知道发生了什么
- 15. 我不知道通过GameObjects的for循环发生了什么
- 16. 不知道发生了什么 - 没有错误(Java新手)
- 17. 有谁知道Parse.com文档发生了什么?
- 18. 我想知道在谓词中发生了什么?
- 19. managedObjectContext是零...不知道发生了什么
- 20. java如何知道mousePressed()事件何时发生?
- 21. 如何知道哪个ace编辑器触发了'onchange'事件?
- 22. 如何知道谁在WPF中引发了路由事件?
- 23. WMP EventDispatcher:如何知道谁发送了事件?
- 24. 如何知道哪个页面触发了Session Start事件?
- 25. 不知道为什么触发事件触发两次
- 26. 记录从Mysql表中消失,我如何知道发生了什么?
- 27. 如何让Netbeans知道文件在外部发生了更改?
- 28. 知道如何转移一个框架(Eclipse插件开发和调试 - 如何找出发生了什么?)
- 29. 如何知道什么视图触发了我的ActionMode?
- 30. 我想知道这个脚本中发生了什么?有什么不同?
点击的按钮ID不会通过VIEWSTATE传输到服务器。 “ViewState保存Web窗体上每个控件的原始属性值 - 在用户进行任何更改之前。” (http://delphi.about.com/library/weekly/aa051705a.htm)使用HTTP POST(post变量)或HTTP GET(查询字符串变量)传输按钮点击和表单控件内容。 VIEWSTATE是一个隐藏的表单元素,并且也被传送,所以ASP.NET可以告诉控件已经改变了。 – 2012-01-30 02:21:33
是的。除了发布到服务器的viewstate参数之外,请注意,Button参数设置为Button,指示在第二种情况下按下了哪个按钮(Button1 = Button)和Button2 = Button。感谢您的评论:) – Mzn 2012-01-30 07:39:48
啊!的确,我现在遵循它。你的目标是正确的。 – 2012-01-30 08:20:50