2012-01-30 56 views
0

我知道viewstate和dopostback和所有东西,我只是不知道引发事件的引用在哪里。说,button1.click被触发,然后当页面通过回发循环,然后page.load被执行,然后引发的事件必须执行,但asp.net如何知道它是哪个事件?asp.net如何知道发生了什么事件?

回答

2

贴有要求,当你点击一个按钮,例如即发的内容,包含了引发事件的控件的名称。在下文中,我使用了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参数中加密,以确保在引发的事件和引发它们的控件中不会发生篡改。它就像事件信息的散列一样。

+0

点击的按钮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

+0

是的。除了发布到服务器的viewstate参数之外,请注意,Button参数设置为Button,指示在第二种情况下按下了哪个按钮(Button1 = Button)和Button2 = Button。感谢您的评论:) – Mzn 2012-01-30 07:39:48

+0

啊!的确,我现在遵循它。你的目标是正确的。 – 2012-01-30 08:20:50

1

在回发中引发事件的控件必须实现IPostBackEventHandler并定义方法RaisePostBackEvent()。该页面将尝试使用其ID来查找控件,否则,您必须将控件注册为需要使用RegisterRequiresRaiseEvent的事件。

你可以阅读更多关于这个在:

1

有隐藏字段,这些隐藏字段包含被点击的控制,以及各种事件参数,这些参数被发回到表单中,然后在服务器端进行解码。

阅读:

http://wiki.asp.net/page.aspx/1082/dopostback-function/

+0

+1我的回答补充了这一点。 – Mzn 2012-01-30 01:49:01

0

它只是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事件。您的事件处理程序被调用,因为它是按上述方式预先注册的,它将对事件处理程序方法的引用存储在列表中。每个事件都有一个当事件被触发时调用的方法列表。您可以为一个事件注册多个处理程序。当事件被触发时,每个预先注册的方法都会被调用。

相关问题