Cuando queremos utilizar un control en una página Web, sea este un Webcontrol o un control de usuario (.ascx) tenemos que añadir siempre en la cabecera, justo después de la directiva de página, una directiva especial que define dónde encontrar el control y cómo trabajar con él. Por ejemplo:
<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>
<%@ Register Assembly="ControlescampusMVP" Namespace="ControlescampusMVP" TagPrefix="mvp" %>
<%@ Register TagPrefix="kwc" TagName="cabecera" src="Controles/Cabecera.ascx" %>
La primera línea es la directiva de página. Las que nos interesan son las otras dos.
La primera directiva de control registra todos los controles contenidos dentro del ensamblado controlescampusMVP.dll y, dentro de éste, todos los contenidos en el espacio de nombres ControlescampusMVP (lo he sacado de un ejemplo del curso de preparación del examen 70-528 de campusMVP) para que puedan ser utilizados enla página actual usando el prefijo "mvp". Así podríamos usar un control de esa DLL cone sta sintaxis:
<mvp:mailToLink ID="MailtoLink1" runat="server" EMail="[email protected]">Mandame un correo</mvp:mailToLink>
La segunda línea se usa para definir un control de usuario "cabecera" cuyo código está ubicado en el archivo Cabecera.ascx dentro de la carpeta Controles. Algo muy típico para reutilizar partes de la interfaz de usuario. Este control sólo hay que arrastrarlo desde el explorador de proyectros sobre la página para obtener una sintaxis similar a esta:
<kwc:cabecera ID="Cabecera1" runat="server" />
Bueno, hasta aquí todo normal y nada nuevo.
Lo que ocurre con la ténica anterior, que por otro lado es la que usa todo el mundo, es que si tenemos el control o controles ubicados en muchas páginas ASPX de nuestro proyecto y, de repente, decidimos cambiar la ubicación de los archivos .ascx o el nombre de una clase, o cualquier otra de las variables que están afectadas por las directivas Register, tendremos que recorrer todas y cada una de las páginas para retocar la defición de los controles. Mala cosa, sí señor :-(
Existe una solución mejor que nos permite tener esas definiciones en un solo punto de la aplicación y poder utilizar los controles en cualquier página. De este modo sólo los definimos una vez y si necesitamos retocar esas directivas no tendremos que recorrernos la aplicación entera para hacerlo.
El "truco" es incluir la definición de los controles en el web.config, así:
<system.web>
<pages>
<controls>
<add tagPrefix="mvp" assembly="ControlescampusMVP"/>
<add tagPrefix="kwc" tagName="Cabecera" src="~/Controles/Cabecera.ascx"/>
</controls>
</pages>
</system.web>
Ahora tenemos definidos los prefijos y los controles en el ámbito global de nuestra aplicación y podemos ponerlos directamente en los formularios sin necesidad de tener que declararlos en cada uno, con las ventajas consabidas.
Antes de que nadie me lo pregunte: no, el hacer esto no implica ningún tipo de merma de rendimiento por el hecho de tener disponibles los controles en todas las páginas, ya que si no se utilizan ASP.NET hace caso omiso de la definición, y si se utilizan el código generado es exactamente el mismo (sólo hay que ir a la carpeta temporal de ASP.NET y ver el código autogenerado allí).
De hecho esta técnica es la que usa la propia plataforma .NET puesto que si vamos al archivo web.config global de la maquina vemos que lo usa, por ejemplo, para incluir a los controles de WebParts.