It does work through HTTP verbs, but the event model in ASP.NET is correct too.
ASP.NET tries to abstract the underlying complexities of HTTP stateless communication in a way that would be easy for traditional WinForms and VB developers to understand. It is debatable if they actually acheived this goal however.
For more information see the MSDN article on the ASP.NET Life Cycle
ASP.NET bridges the gap by having what is known as a ViewState exist on both the server side session and a client DOM element. Everytime there is a postback to the server, the ASP.NET lifecycle events are fired in order, causing the server side objects to be created, updating the viewstate with the updated information from the client, updating the server side elements with data from the viewstate, executing any server side events that need to be executed, and finally rendering the HTTP response to return back to the client.
The client at that point will take the updated viewstate from the server and use it to update its own DOM elements and execute client side events as necessary.
If it seems complex that is because it is. This is why many view it as a failure because it requires detailed understanding of the underlying architecture to really become good with it.