The Codebehind vs. Inline Code ASP.NET Debate
By Peter A. Bromberg, Ph.D.
Printer - Friendly Version
Peter Bromberg

Over the last 2 years, I’ve run into several situations where developers have moved from classic ASP to ASP.NET and have chosen (not always correctly, in my opinion) to use their own "custom methodology" in an effort to avoid the codebehind model that’s built into Visual Studio.NET. There are a number of reasons for this; they're not always all logical, and some are downright fallacious. I'll try to address some here and hopefully some of these ideas will ring true.

Lots of us web programmers learned to write Active Server Pages using Visual Interdev or similar web-development tools. Many of us have had a difficult time adjusting to the VS.NET paradigm. I know I certainly did. Developers coming from Classic ASP are used to breaking down their applications into a series of ASP pages, each encapsulating both the visual HTML interface and the logical code behavior for that interface. And in some cases, the decision was made to encapsulate the generation of the UI along with the business logic all in the same code methods with inline looping and construction of UI elements with multiple Response.Writes – not usually a good OOP programming decision, because the UI portion has now gotten irretrievably bound to the business logic behind it. Of course in Classic ASP, we often didn't have any other choice except perhaps for filling in <%=xyz %> script tags that were interspersed with our HTML elements. However, when this technique is now translated into ASP.NET where major elements of the resultant UI are now locked up hardcoded into class libraries, it becomes even more ugly from a maintenance perspective.

If you look at many of the code samples from the .NET beta days that were written mostly by ASP developers using the Framework SDK, before VS.NET came out, you'll see lots of inline code examples. Even the first IBuySpy reference app was delivered in both code-behind form and in single-page code - inline ASP.NET pages. I remember - I was there at PDC 2000 when they gave it out!

The term “Codebehind” simply refers to code that a web form (or web service or user control or other ASP.NET page type) uses that is not located in the ASPX or other file requested by the browser. The design / architecture process of separating code from the primarily HTML within a web form offers many advantages, not the least of which are allowing GUI and graphics designers to work with the HTML in say, Dreamweaver without destroying the business logic, and especially for VS.NET users, greatly enhanced support from the IDE. Visual Studio .NET has almost no support for coding within an ASPX page using <script runat="server> inline code. Consequently, developers who have chosen to use this as their primary programming model have - by definition - forced themselves into a very restricted programming model from an IDE productivity standpoint.

Even an ASPX page with no code on it gets turned into an instance of the System.Web.UI.Page class. The page is parsed by the ASP.NET engine when it is first requested, and then its JIT compiled version is cached in the Temporary ASP.NET Files folder as long as the application is running and the .aspx page hasn't been changed. Since the ASPX page is always instantiated as an object, you can modify its parent class and have it inherit from a class of your choice, provided that your class eventually inherits from System.Web.UI.Page. You can also have different pages set references to the class files of other pages, which makes possible some very interesting sharing of items.

Visual Studio .NET uses the Codebehind attribute by default. The Codebehind attribute is completely ignored by the ASP.NET runtime. It is only used at design time by Visual Studio .NET to associate files with their codebehind class files during development. Since VS.NET projects compile all files in the same project into a single assembly that is placed in the /bin folder, there is no need for any runtime JIT compilation of the codebehind files - the assemblies are all found in the /bin folder. This makes for efficiency of code execution because the code for multiple pages, Global and other classes are all in a single assembly in memory, and also can help prevent problems by not having lots of strangely - named JIT – compiled assemblies in the Temporary ASP.NET Files directory.

Probably the single biggest advantage of using the Codebehind paradigm, in my opinion, is the ability to wire up intrinsic and custom events, using ASP.NET intrinsic and custom servercontrols such as DataGrids, repeaters, dropdown listboxes and many others, and provide a much richer, more professional "Windows - like" experience for the user. While this can be done with inline code, its not easy, and it certainly is not fun. Combined with ViewState, Cache, Session, SmartNavigation and other built-in technologies, the Visual Studio.NET IDE productivity gains in using the codebehind model cannot be disputed. What I mean very simply is, you would have to write one hell of a lot of custom code to get most of the functionality of the ASP.NET DataGrid control, but why on earth would you want to do it when 90% of the time you can get everything you need and more from the built - in control ( or you can derive from it and customize even more)? If you have made the investment of time required to study it, it's possible to set more DataGrid custom UI behavior, DataBinding, attributes and properties in the IDE with codebehind in ten minutes just by using the Properties TAB than many developers could write in a day, using inline - only coding techniques. Page design is also enhanced because you can choose between Grid and Flow layout and precisely position page elements in the Designer.

Although VS.NET doesn't stop you from creating applications using inline code, its model of abstracting lower layers of UI processing using the code-behind paradigm is much more intuitive. The compiler can also do type checking and allow full IntelliSense when using code-behind files; these are not readily available when you’re writing inline code. It’s possible to compile applications that have errors in the inline code which become apparent only when the final code is executed. The same error-containing code placed in a code-behind file will be trapped when you attempt to do a build. This makes for a much more productive, RAD experience, especially when multiple developers are simultaneously working on the same codebase in a source - control environment.

Is there an Inline Code Justification?

Sure there is. There are certain situations where a purely inline - code implementation is justified. However, in many of these cases, upon inspection, it can be determined that the developers who claim they "had to do it this way" could have, with a little study, implemented it with the codebehind paradigm after all, had they taken the time to solve the minor complexities that seemed to at first compel them to use an inline-only code implementation. The benefits to the developer group and its potential new members in terms of ease of maintenance and developer productivity will almost always be worth the small amount of pain that must be endured to make it happen.

You'll probably hear lots of objections from developers who want to avoid using the Codebehind model. My experience has been that most of these objections are born more out of lack of knowledge and experience than from careful thought and study. Do you agree? Disagree? Feel free to post your comments in our forums in the Article Discussion area.

As architects, we understand that not all coding standard decisions are easy choices, but having standards in an organization allows current and future developers to more easily understand, maintain, debug, and extend the codebase they work on daily. Make sure your company successfully resolves the inline vs. code-behind debate before you get too far down the development path with ASP.NET. After all, you don't want to wake up one morning with a new career where your vocabulary consists of the sole phrase "Paper or plastic?".

Peter Bromberg is a C# MVP, MCP, and .NET consultant who has worked in the banking and financial industry for 20 years. He has architected and developed web - based corporate distributed application solutions since 1995, and focuses exclusively on the .NET Platform.