È possibile spostare lo SpiffyControl in una libreria - questo gli darà uno spazio dei nomi più preciso e ti permetterà anche di usarlo in altri progetti.Questo è un po 'complesso, però - hai già creato un UserControl, ma non funzionerà in una libreria. UserControls usa il modello codebehind - sono composti da due file, un markup e un codice. Le librerie non sembrano supportare il modello codebehind, quindi non è possibile utilizzare un UserControl. È necessario convertire tale controllo utente in un controllo web.
Creare un nuovo progetto di libreria di classi. Aprire le proprietà del progetto e impostare AssemblyName e Spazio dei nomi predefinito su SpiffyLibrary.
Ora abbiamo bisogno di convertire il tuo UserControl. Per prima cosa, crea una classe nella tua nuova libreria. Chiamalo SpiffyControl, proprio come il tuo controllo utente esistente, ma fallo ereditare da System.Web.UI.WebControls.CompositeControl.
In secondo luogo, apri il codice per il controllo utente esistente e copia tutto all'interno della classe. Quindi torna alla nuova classe e incolla tutto all'interno. Se si sta utilizzando uno degli eventi di controllo standard, potrebbe essere necessario rinominare tali funzioni per ignorare gli eventi appropriati. Ad esempio,
protected void Page_Load(object sender, EventArgs e)
{
...
}
... dovrebbe diventare ...
protected override void OnLoad(EventArgs e)
{
...
base.OnLoad(e);
}
Terzo (questa è la parte complessa) è necessario per riprodurre tutto il markup che si aveva in file di markup di SpiffyControl. Non puoi semplicemente copiarlo, ma devi sovrascrivere la funzione CreateChildControls() che è ereditata da CompositeControl. Ogni tag che hai nel markup deve essere istanziato come una variabile e aggiunto alla collezione Control della classe. Così, per esempio, se il file di markup esistente si presentava così:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SpiffyControl.ascx.cs" Inherits="Controls_SpiffyControl" %>
<div id="Div1" runat="server">
<asp:Label ID="TextOutput" runat="server" />
</div>
... allora la vostra funzione di nuove CreateChildControls dovrebbe assomigliare a questa:
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();
}
Nota che i controlli sono dichiarati come campi di classe; in questo modo, sono visibili a tutti i metodi di classe.
Una volta convertito il markup, compilare il progetto di libreria e aggiungerlo ai riferimenti per il progetto del sito web. Quindi apri il file web.config del tuo sito web e trova la sezione system.web/pages/controls. Questa sezione dovrebbe già avere un tag come questo:
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
Quel tag è quello che consente di utilizzare i controlli dalle librerie principali ASP. Quindi stiamo andando ad aggiungere uno uguale, per la nostra biblioteca:
<add tagPrefix="spiffy" namespace="SpiffyLibrary" assembly="SpiffyLibrary" />
Ora ovunque nel vostro sito, si può mettere in markup come questo:
<spiffy:SpiffyControl ID="SpiffyInstance" runat="server" />
... e che la volontà carica il tuo controllo web dalla tua libreria personalizzata.
È possibile utilizzare LoadControl, ma trasmetterlo. SpiffyControl spiffy = (SpiffyControl) LoadControl ("usercontrol.ascs"); – Geoff
Il problema è che non riesco ad accedere al tipo SpiffyControl, quindi non posso nemmeno scriverlo - se potessi scriverlo, potrei anche semplicemente istanziarlo. –
Perché non riesci ad accedere al tipo SpiffyControl? – Jonas