I decided to write this post after reading the first chapter of an upcoming book on ASP.NET MVC entitled "Professional ASP.NET MVC 1.0" published by Wrox.
You can find an introductory post on ASP.NET MVC by Scott Guthrie @ http://weblogs.asp.net/scottgu/archive/2009/03/10/free-asp-net-mvc-ebook-tutorial.aspx. You will be pleased to realize that the first chapter is absolutely free and it is written by Scott Guthrie himself. It is quite a lengthy read (approximately 190 pages), but the content is excellent.
ASP.NET MVC is not only plumbing code - it is basically a guidance package that enables developers to build/test/maintain ASP.NET web applications in an architecturally sound way. MVC is an acronym for Model-View-Controller, which is a very famous design pattern. You can find more information about it @ http://en.wikipedia.org/wiki/Model-view-controller
Do not confuse the MVC design pattern with the M-V-VM (Model-View-ViewModel) design pattern which is a little different, and is mainly utilized in WPF client-side applications such as Silverlight.
ASP.NET MVC 1.0 is very RESTful and extremely "clean". Everything is done with good design/architecture in mind and separation of concerns is strictly enforced. Yes, you can customize it, but by default, even folder names and class names should follow the designated conventions in order to be used effectively.
While reading the chapter, I noticed a few new concepts that I did not know before. I have decided to list them here. I hope you find them useful. The quotes are from Scott Guthrie, and the explanations are mine.
- "LINQ to SQL will automatically handle escaping SQL values for you when using strings - so you don't
need to worry about SQL injection attacks when using it." Of course, all of us lose sleep over SQL injection attacks. What, you don't? 
- "Partial classes can be used to add methods/properties/events to classes maintained by a VS designer (like the Dinner class generated by the LINQ to SQL designer) and help avoid the tool from messing with our code." I am sure you already know about partial classes, but the next one is new to me...
- "The OnValidate() partial method is a hook that LINQ to SQL provides that allows us to be notified
anytime the Dinner object is about to be persisted within the database." Partial methods are especially useful as a way to customize generated code. You can read about partial classes and methods @ http://msdn.microsoft.com/en-us/library/wa80x488.aspx
- "Why differentiate via HTTP verbs?" The two most used verbs with the HTTP protocol are HTTP GET and HTTP POST. When a crawler crawls your website (for indexing purposes) it follows links which are HTTP GET, and it should not make any HTTP POST requests to the site. First, you should make sure that no HTTP GET requests actually change server state - we have HTTP POST for that. As well, bookmarking a page and sending it to others to use will also use HTTP GET. Suppose you are editing your profile on a website. You have requested to edit your profile with the following URL (HTTP GET): http://site.com/UserProfile/Edit/[id]. After you are finished editing it, you will need to submit the form to the server. You can either submit the form using HTTP POST to the same URL, such as http://site.com/UserProfile/Edit/[id] or use a different URL such as http://site.com/UserProfile/Save/[id]. Which one is better? In either case you are performing an HTTP POST. However, if you use the http://site.com/UserProfile/Save/[id] URL for saving and a form validation error occurred with one of the form fields, the browser will re-display the form. Now, if the user decided at this point to bookmark the URL and send it to his friend, his friend will not be able to access that page, since he/she will be performing an HTTP GET on a URL that does not support HTTP GET requests. On the other hand if we used the same URL such as http://site.com/UserProfile/Edit/[id] for both HTTP GET and HTTP POST, upon a validation error the form will be redisplayed with same URL. The user can go ahead and bookmark it and even send to his friend. His friend should have no problem accessing the URL. The bottom line is: The user can bookmark a URL at any time, so make sure the URLs you use are always valid HTTP GET URLs. On a side note, Silverlight 3 promises to have excellent support for SEO (Search Engine Optimization), and the user should have no problem navigating Silverlight 3 content using the browser's back/forward buttons.
- "The IQueryable<Dinner> object returned by our FindUpcomingDinners() method encapsulates a query
to retrieve Dinner objects from our database using LINQ to SQL." Basically, IQueryable<T> encapsulates a LINQ query. This query is not executed until you call ToList() on it, or iterate on it using a foreach statement. Therefore, if a method returns an IQueryable<T> you can actually chain additional queries on top of it, and thus modify the query. With LINQ you can query relational data, XML data, and even POCOs (Plain Old CLR Object), with a unified query syntax. I recommend you get familiar with LINQ since it is very useful and may save you hours or even days on querying functionality you had to write yourself before.
As you can see ASP.NET MVC 1.0 is much more down-to-the-metal than the traditional ASP.NET framework. You are actually forced to think about raw HTTP GET/POST requests and how you handle them. This offers a lot of flexibility, but you must be careful not to abuse this added responsibility. The only thing Scott Guthrie fails to address in his first chapter is how we can use the myriad of existing ASP.NET server controls with ASP.NET MVC. However, I am sure this will be covered in subsequent chapters.
Enjoy the read!