I didn't want to derail the HTML5 Gaming thread, so here goes.
ASP.NET started out on the wrong path. In "classic" ASP, Microsoft had a serviceable scripting language that allowed dynamic output of HTML. Sure, it was kinda slow, and rife with security issues, and didn't have a lot of tools available to aid in development, but it got the job done. What functionality wasn't made available as part of the platform was available from legions of companies whose business was built upon filling in the gaps. It was the web scripting equivalent of VB6. Better than VB6, though, you could use VBScript or JScript to script the pages. As it turns out JScript actually worked pretty well as a server-side scripting language.
With the introduction of .NET, Microsoft made a big change in several departments. They made their programming languages fully OO and strongly typed. A welcome evolution, as almost anyone will tell you. The use of an interpreter in between the code and the actual OS as arguable, but has worked relatively well (after fixing some stumbles out of the gate). Sure, they haven't bothered to port the interpreter to other platforms (which is basically the whole point of having an interpreted language), but the Mono project has stepped in and done a remarkable job at reverse-engineering the process.
However, the most dramatic change in the shift to .NET was the ASP.net platform. Rather than simply allowing for these new languages to function as a way to dynamically generate HTML, Microsoft took it upon themselves to shoehorn the web platform (html) into a desktop programming paradigm, complete with state and event models. It's an attempt to mask the stateless, markup-driven web environment and instead treat the web as another desktop platform. Perhaps a noble intention, but at the end of the day it falls short -- waaaay short.
ASP.net (at least, in its classic "forms" setup) relies on convoluted hidden inputs on a page to maintain state and handle events. Inputs that are placed on a page are modified (in name and functionality) before actually being output to the browser. This is all done behind-the-scenes; as far as ASP.net is concerned, you create your app in its environment and it will handle the output mechanism. That's fine and dandy, I suppose, but what if it's not working correctly? What if you need to get under the hood and understand why, say, a "event" isn't firing? (I put event in quotes because it's not a REAL event; it's a post-back with specific form parameters.) Well, too bad. You can't. You're relying on a black-box that's inserted between you and the actual environment your user interacts with. It's the same reason so many people hate Flash.
Why not just trust the programmer to know how the web works? They had to with classic ASP, and need to with PHP, Python, Ruby, and other modern web scripting languages. I find it rather insulting that Microsoft feels that they need to hand-hold a desktop programmer through the web programming environment. It's not just training wheels, it's converting the bicycle to a motorized four-wheeler because they think their programmer is used to driving a car. Well, guess what, I know how to ride a bike and I don't want or need that "help."
Speaking of hand-holding, ASP.net has a slew of controls that are supposed to make life easier for developers. For example, the ListView makes it painfully easy to connect to a database and display the data in a table on a web page. It has a cute little wizard that guides you through connecting to the database, choosing your display criteria, and even makes an attempt at some basic formatting. It supports auto-generation of update and delete "code" to make for a quick CRUD interface. Super. But, what if you want to customize what comes back in your result set? If you modify the query (an "advanced" option), guess what -- the "wizard" now only generates your select but won't do your update/delete statements for you! You're forced to go into the inner workings of the generated "code" (I put that in quotes because it's a mish-mash of xml and markup) and figure out how to add in those other options. So, the simple CRUD application that was made easy by a wizard has now become an effort that has taken more time to complete than an equivalent application using a scripting language that doesn't get in between me and the output.
That's just one example, but I find it repeatedly when working with ASP.net. Sure, a response to that would be "don't use those controls, then!" Not a problem, except since they're made available, everyone and their mom already uses them, which means if I'm not making this thing from scratch, I still have to wade through it time and again.
Back to the whole "putting something between you and the web environment" thought. Why do they feel the need to take the simplest of concepts and wrap them in the most convoluted, wordy, eye-crossing Microsoft-ese? I want to read a table's contents and output it to an html table. To do that in ASP.net, you have to create a "data provider" (which could be something like "reporting an analysis services", or some sh*t), a "List View Control", "Bind the data provider to the control", configure the "data source parameter control values", and on and on and on. The "list view" has a header template, a selected item template, a row template, an *alternate* row template, a footer template, and FSM knows what else. Sweet jesus, man, I want to do a simple select and loop through the results.
I'm going to start using the MVC implementation of ASP.net (a completely separate environment, mind you, that won't work with the existing "forms" setup) and see if that redeems it at all in my eyes. I have high hopes, but I can't shake the feeling they'll find a way to make it harder than it needs to be.
The bottom line is this: Why does it have to be so complicated? Don't even get me started on their half-assed "AJAX" add-on. If you're a web developer, all of this crap just gets in the way. The web is the web, there's no need to pretend it's a desktop application. Trying to force it to be one is counter-productive and has wasted countless hours of my life.
Phew, that feels better. /rant