The ASP.NET MVC Framework was a vision of Scott Guthrie in early 2007. With a prototype demonstration in late 2007 as well as a key hire of Phil Haack as the Senior Program Manager of the feature team, Scott made the vision a reality. At a time when the .NET community was becoming frustrated that other platforms had great MVC frameworks like Tapestry, Rails, and so on, Web Forms was losing favor as developers struggled to make it do things previously unimagined when it became public in 2001. Castle MonoRail was a very capable framework and continues to have strong leadership behind it, but the broader .NET industry needed a change from Web Forms. Phil Haack, with his experience outside of Microsoft as well as in the open source community, immediately came in and led the ASP.NET MVC Framework team to a successful 1.0 release that the .NET community is excited about.
ASP.NET MVC has the benefit of lessons learned from other popular MVC frameworks such as Struts, WebWork, Tapestry, Rails, and MonoRail. It also came about as C# starts to push away its fully statically typed roots. The language enhancements introduced with .NET 3.5 have been fully leveraged in the ASP.NET MVC Framework, giving it a huge advantage over frameworks that came before as well as all the Java frameworks that are tied to the currently supported Java syntax.
For people who have a diversified software background, ASP.NET MVC is a great addition to the Visual Studio development experience. For those who began their software career with .NET 1.0 or later, it is a fundamental shift in thinking since they grew up with Web Forms being “normal” web development.
This book attempts to start at a point that is past the documentation and online tutorials available on the ASP.NET MVC website at http://www.asp.net/mvc/. If you are just getting started with ASP.NET, you will want to read some of the older books covering the ASP.NET pipeline and server runtime. Because ASP.NET MVC layers on to ASP.NET, it is important to understand the fundamentals. If you are a current ASP.NET developer, you will find that this book does not insult your intelligence. It is a fast-paced book aimed at giving you the why and not just the how.
Since ASP.NET MVC is a new technology offering you can expect several books to cover the topic. This is a framework that is not sitting still. Since its release in March 2009, several books have been released, but the community is finding new and better ways to use the framework. The newest ideas make their way to the MvcContrib project, and to public release frequently as new additions are contributed. Because of this dynamic, this book covers ASP.NET MVC with MvcContrib sprinkled throughout. The authors are all actively developing with the framework, and MvcContrib plays a vital part in every application. This books aims to have a long-lasting place on your bookshelf. The API will evolve, but the principles behind using an MVC framework as well as the ways to structure URLs, tests, and application layers are more durable. With this, we hope that this book serves not only as a rigorous foray into ASP.NET MVC development but also as a guide toward developing long-lived web applications on the .NET platform.
We hope that the arrival of this book is considered good timing because the text was written with the perspective of the roadmap of ASP.NET MVC 2.0 in mind. With the roadmap plans released and the first CTP of v2 already available, the techniques in this book are useful now and are also relevant for ASP.NET MVC v2, which is quickly approaching. We hope this book will help you start on your way to creating many maintainable, long-lived applications on the new version of ASP.NET.
This book is written for senior developers working with ASP.NET. The authors are senior and strong leaders in their companies, local community, and the industry. All three authors are recognized by Microsoft with the Microsoft Most Valuable Professional (MVP) award. With that in mind, we felt it appropriate to write a book aimed at senior members of the software team. With the market flooded with beginner books and books that reformat online documentation and tutorials, we attempted to write a book that might leave some beginners behind but at the same time challenge senior developers and architects. Whether or not you are familiar with other MVC frameworks, this book will push your knowledge further than you are accustomed to when reading a technology book.
The book comes with a full reference implementation in production at http://CodeCampServer.com. CodeCampServer was developed by the authors and is open source with many other contributors at this time. CodeCampServer is an ASP.NET MVC application aimed at hosting user group websites and websites for .NET user group conferences, frequently called Code Camps. The codebase was developed using Onion Architecture, domain-driven design, test-driven development, and inversion of control. The techniques espoused in the book are implemented in the project. Many of the code examples in the book are detailed explorations of parts of CodeCampServer. Although the project will continue to evolve after this book is published, the principles with which it and the text were written are timeless and portable beyond a single version of the technology.
Because in any real project, like CodeCampServer, you use many libraries for specific things, we did not shy away from using these as well. We feel that avoiding other libraries for the sake of simplicity also makes it difficult for the reader to apply the knowledge gained while reading. With that in mind, we use popular libraries such as MvcContrib, NAnt, NUnit, StructureMap, Windsor, Castle, RhinoMocks, Log4Net, NHibernate, Tarantino, AutoMapper, Iesi.Collections and many others. Because real projects have a collage of libraries, we felt that learning ASP.NET MVC in this realistic setting was most appropriate. We have taken care to separate concerns when necessary. We always separate data access from the domain model and the presentation layer, and we separate presentation model from views; you will not see simplistic examples such as performing a query directly from a UI controller. This is bad practice in anything but the most trivial applications such as that serving http://PartyWithPalermo.com (a three-page site). Real applications have many screens, the embedding data access and other logic in the UI is a recipe for a codebase that is very costly to maintain.
We’ve done our best to call out where we expect existing ASP.NET knowledge to tie the example together, but if you find yourself wondering what an HTTP module is, you will probably want to read one of the earlier ASP.NET books.
Chapter 1 throws the reader directly into code by picking apart the default project template. After a primer on routes, the text moves through a simple controller and view and moves to initial maintainability. The chapter follows up by covering the basics of testing controllers.
Chapter 2 moves into the model. It covers not only the domain model of the application but also the need for different types of models depending on usage, such as a presentation model. Because the authors consider using a presentation model, commonly called view model, essential for the maintainability for nontrivial systems, it is used right away.
Chapter 3 covers controller details. The controller can be very simple or quite complex, and the text covers both. The chapter explores working with form values and querystring values, and it covers model binding, which is one of the most-needed abstractions for ASP.NET to date. Chapter 3 concludes after outlining all the available extension points that are built in.
Chapter 4 gives further insight into views. After outlining the key abstractions in the default view engine, it pulls the reader along to essential concepts such as layouts, partial views, and building your own validation and HTML helpers.
Chapter 5 goes deeper than you will ever need into routing. Although most projects will not need this amount of advanced routing, we explore the topic thoroughly. We cover the why and not just the how of crafting URLs. From designing a URL schema to adding dynamic routes, this chapter is a comprehensive guide to the most flexible routes you will need.
Chapter 6 explores the many ways to customize and extend the ASP.NET MVC Framework. It starts with custom route handlers and moves to when, why, and how to create your own controller factory. Two Inversion of Control containers are covered in the controller factory section: Windsor and StructureMap. Because most nontrivial applications will want to use a custom controller factory, this section is covered thoroughly. Next the chapter moves through the ways to extend the controller with action invokers and filters. After a custom view engine and using the new T4 templates, the reader will have the full picture of the available extension points.
Chapter 7 communicates ways to scale the architecture for more complex sites. The first is solving the problem of large controller actions and how to move multiple, ill-placed responsibilities out of the controller. View helpers are also covered in more detail as well as techniques for segmenting large views into a number of cohesive smaller ones. The chapter also covers larger issues encountered with action filters.
Chapter 8 offers ways to leverage existing ASP.NET features in an ASP.NET MVC application. The text covers how to use existing server controls, then moves to caching, both output caching and using request level caching provided by HttpContext.Items. It then moves through tracing, health monitoring, site maps, personalization, localization, linq, cookies, session state, and configuration. Because ASP.NET MVC is an add-on to ASP.NET and not a replacement, this chapter ensures the reader understands where all these existing features fit.
Chapter 9 has been one of the most popular chapters in the early access program because now, in mid-2009, AJAX is a hot topic. We first lay down our opinionated view on AJAX and then outline the most common uses and techniques for it starting with simple HTML replacement. The chapter covers implementing a REST API with controllers as well as some of the third-party libraries and controls available for AJAX. The chapter also outlines ways to make controller actions automatically support AJAX.
Chapter 10 covers hosting and deployment. Though not as sexy of a topic as AJAX, it is critical to understand how to deploy applications built on this framework to IIS5/6/7/7.5. All versions are covered in detail as well as the implications of using extensions, wildcard mappings, and URL rewriting. After covering XCopy deployment, the chapter delivers techniques for managing production and development environment settings. The chapter closes out with an autodeployment example that is similar to how CodeCampServer is autodeployed in the wild.
Chapter 11 explores MonoRail and Ruby on Rails as a comparison and benchmark against ASP.NET MVC. It starts out with MonoRail and covers validation, data access with ActiveRecord, as well as the view engine choices. Rails follows closely on its heels with “The Rails Way,” ActiveRecord and ActionPack. The purpose of the chapter is to give the reader some familiarity with competing MVC frameworks because good ideas come from everywhere.
Chapter 12 uses the controversial title, “Best Practices.” We outline the context that these practices support. We outline best practices for controllers, views, routes, and testing. Each topic has very opinionated recommendations borne from real-world usage of ASP.NET MVC in this type of application.
Chapter 13 provides four comprehensive recipes that can be easily implemented on your project. One of the larger chapters, it starts with using jQuery for an autocomplete text box and then moves on to how to implement automatic client-side data validation. Data access with NHibernate is the next recipe and provides a full vertical slice implementation for calling data access backed by NHibernate from controllers. It outlines how to map and configure NHibernate as well as some basic mapping and querying techniques. The chapter wraps up with a full Spark view engine implementation for those who don’t like the tag format of Web Forms.
All source code in listings or in text is in a fixed-width font like this to separate it from ordinary text. Code annotations accompany many of the listings, highlighting important concepts. In some cases, numbered bullets link to explanations that follow the listing.
The source code for the examples in this book is available online from the publisher’s website at http://www.manning.com/ASP.NETMVCinAction.
The purchase of ASP.NET MVC in Action includes free access to a private web forum run by Manning Publications, where you can make comments about the book, ask technical questions, and receive help from the author and from other users. To access the forum and subscribe to it, point your web browser to http://www.manning.com/ASP.NETMVCinAction.
This page provides information about how to get on the forum once you’re registered, what kind of help is available, and the rules of conduct on the forum. Manning’s commitment to our readers is to provide a venue where a meaningful dialogue between individual readers and between readers and the authors can take place. It’s not a commitment to any specific amount of participation on the part of the authors, whose contribution to the book’s forum remains voluntary (and unpaid). We suggest you try asking them some challenging questions, lest their interest stray!
The Author Online forum and the archives of previous discussions will be accessible from the publisher’s website as long as the book is in print.