In all my ASP.NET Web Applications I create a separate assembly that holds all custom controls used by the web application. I, personally, believe this to be an ASP.NET Best Practice because it promotes reusability - the ability to create various libraries that can be shared from application to application. This is how control / component vendors do it, so I think it makes sense for freelance web developers and consultants to do it as well.
In ASP.NET 1.1, you had to register the assembly on all pages using the custom controls via the Register Directive:
<%@ Register
TagPrefix="FTB"
Namespace="FreeTextBoxControls"
Assembly="FreeTextBox" %>
ASP.NET 2.0 provides a much more elegant solution by allowing you to register the custom control library in the Web.config so you don't have to clutter up your ASP.NET 2.0 Pages:
<system.web>
<pages>
<controls>
<add assembly="FreeTextBox"
namespace="FreeTextBoxControls"
tagPrefix="FTB" />
</controls>
</pages>
</system.web>
It's not sexy, but anytime I can pull anything into the Web.config so as not to clutter up my pages and controls - I'll do it! :)
Source: David Hayden ( ASP.NET Developer )