Puede mover su SpiffyControl en una biblioteca - esta le dará un espacio de nombres más preciso y también le permitirá usarlo en otros proyectos.Sin embargo, esto es un poco complejo: ya tiene un UserControl hecho, pero no funcionará en una biblioteca. UserControls usa el modelo de código subyacente; están compuestos por dos archivos, un marcado y un código. Las bibliotecas no parecen ser compatibles con el modelo de código subyacente, por lo que no puede usar un UserControl. Necesita convertir ese control de usuario a un control web.
Cree un nuevo proyecto de biblioteca de clases. Abra las propiedades del proyecto y establezca AssemblyName y Default Namespace en SpiffyLibrary.
Ahora tenemos que convertir su UserControl. Primero, crea una clase en tu nueva biblioteca. Llámelo SpiffyControl, al igual que su control de usuario existente, pero hágalo heredar de System.Web.UI.WebControls.CompositeControl.
En segundo lugar, abra el código para su control de usuario existente y copie todo dentro de la clase. Luego regrese a la nueva clase y péguelo todo adentro. Si está utilizando cualquiera de los eventos de control estándar, es posible que deba cambiar el nombre de esas funciones para anular los eventos apropiados. Por ejemplo,
protected void Page_Load(object sender, EventArgs e)
{
...
}
... ... debe convertirse en
protected override void OnLoad(EventArgs e)
{
...
base.OnLoad(e);
}
Tercera (esta es la parte compleja) que necesita para reproducir todo el margen que tenía en archivo de anotación de SpiffyControl. No puede simplemente copiarlo; en su lugar, debe anular la función CreateChildControls() heredada de CompositeControl. Cada etiqueta que tenía en el marcado necesita ser instanciada como una variable y agregada a la colección de Controles de la clase. Así, por ejemplo, si el archivo de marcado existente era la siguiente:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SpiffyControl.ascx.cs" Inherits="Controls_SpiffyControl" %>
<div id="Div1" runat="server">
<asp:Label ID="TextOutput" runat="server" />
</div>
... entonces su función de nuevos CreateChildControls debería tener este aspecto:
HtmlGenericControl Div1;
Label TextLabel;
protected override void CreateChildControls()
{
Div1 = new HtmlGenericControl("div");
this.Controls.Add(Div1);
TextLabel = new Label();
Div1.Controls.Add(TextLabel);
base.CreateChildControls();
}
Tenga en cuenta que los controles se declaran como campos de clase; de esa manera, son visibles para todos los métodos de clase.
Una vez que haya convertido su marcado, compile el proyecto de la biblioteca y agréguelo a las referencias para su proyecto de sitio web. A continuación, abra el archivo web.config de su sitio web y busque la sección system.web/pages/controls. Esta sección ya debería tener una etiqueta como esta:
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
Esa etiqueta es lo que le permite usar los controles de las bibliotecas centrales de ASP. Así que vamos a añadir uno igual, para nuestra biblioteca:
<add tagPrefix="spiffy" namespace="SpiffyLibrary" assembly="SpiffyLibrary" />
Ahora en cualquier lugar de su sitio, se puede poner en el marcado de esta manera:
<spiffy:SpiffyControl ID="SpiffyInstance" runat="server" />
... y que la voluntad cargue su control web desde su biblioteca personalizada.
Puede usar LoadControl, pero echelo. SpiffyControl spiffy = (SpiffyControl) LoadControl ("usercontrol.ascs"); – Geoff
El problema es que no puedo acceder al tipo SpiffyControl, así que tampoco puedo transmitirlo. Si pudiera lanzarlo, también podría simplemente crear una instancia. –
¿Por qué no puede acceder al tipo SpiffyControl? – Jonas