The collective jaws were dropped at ALT.NET. Just about everyone attended this talk by Scott Guthrie. If you’d like to watch this, Scott Hanselman has recorded the video and posted on his blog.

Rather than regurgitate it all here, I’ll quickly summarize what it’s like.
Remember HTML? Yeah, that. We are going back to our roots and back to the model that the web really lives in, not a psuedo, event-driven state-based model that is ASP.NET Web Forms.
Why don’t we like ASP.NET Web Forms? I do like it, but it does have it’s problems. The benefits of ASP.NET often cause other concerns to rise up. Tired up re-populating data on the form? Here’s some Viewstate for you. Of course Viewstate causes page sizes to explode because most people just leave it on, even for read-only pages with no post-backs. Think of a grid that you place on a page. If you don’t have to postback to the same page again (like with a command field or something) then you can turn viewstate off and have a savings of almost 2X! I for one think that ViewState can be awesome, but it is more likely abused than leveraged. This is a pain point for many people.
The entire postback model, combined with the event-driven model is something that I have had to learn in-depth the hard way. I really don’t think any of that knowledge is really helpful at all outside of ASP.NET. I spent a crapload of time trying to get server controls to work in the complicated ASP.NET lifecycle, and does that knowledge transfer? Probably not.
Lastly I think that ASP.NET’s templated control syntax often requires an equal or even more lines of code than the actual HTML would take in the first place! Take the GridView for example. Sure it’s great and it lets you bind data and get columns autogenerated for you, but take a look of that list of properties. There is so much there that you almost need a degree in GridViews to be effective with it.
Microsoft has been paying attention to the community. We’ve been readily ditching ASP.NET Web Forms in favor or Ruby on Rails or MonoRail.
ScottGu presented the new MVC framework (codenamed Scalene) to a huge audience. There was a lot of trash talking (in a good way) between ScottGu and Scott Bellware. It’s not easy to take blundt criticism from people like ScottB, but The Gu took it incredibly well and even dished it out a bit.
What I really liked about ASP.NET MVC is that there isn’t that much to it. Here’s what you’d need to do to start using it on your project (exisitng or new):
- Add the System.Web.MVC.dll (or however it will be packaged — no installer exists yet)
- Add 1 HttpHandler to handle a new extension
- Add 1 HttpModule, which provides all of the routing and black magic of MVC
Create a controller class, like this:
//This example is for you, Jacob Lewallen :)
public class ClownsController : Controller
{
[ControllerAction(DefaultAction = true)]
public void List()
{
ViewData = Clown.FindAll(); //you write this method or use Castle ActiveRecord for example
RenderView("List");
}
public void SomethingSecret()
{
//this cannot be accessed by a url
//because it doesn't have the attribute
}
}
Next you’ll need a view. You can use aspx, Brail, or NVelocity as your templating language. That’s freaking great that you can choose.
Here’s a quick example of an aspx view:
<h1>Clowns</h1>
<table>
<tr>
<th>Name</th>
<th>Number of Balloons</th>
<th>Likes Kids?</th>
</tr>
<% for(var c in ViewData) { %>
<tr>
<td><%=c.Name%></td>
<td><%=c.Balloons.Count.ToString() %></td>
<td><%=c.LikesKids? "yes" : "no" %></td>
</tr>
<% } %>
</table>
Notice how I get to use standard HTML constructs, use code blocks to provide view functionality & data, and I don’t have to mess with postback or viewstate at all because I don’t need it.
Wait, you mean we have to learn HTML again? D.H.H. often reminds us that the HTML is provides beautiful constraints that he is happy to work inside of. We don’t have any naming containers here. In fact, we don’t have any unnecessary id elements at all! If we did, they would be exactly what we typed here, making javascript integration a lot easier.
To wrap this all up, a customizable route in the Global.asax will map the following url to render this page:
http://your_url/clowns/list <— look how clean!
The framework knows how that the format is http://your_url/[controller]/[action] and so it instantiates your ClownsController and looks for an action called List().
So much more to talk about, but I’ll be posting more details once I get my hands on it.