Vous pouvez déplacer votre SpiffyControl dans une bibliothèque - ce lui donnera un espace de noms plus précis et vous permettra également de l'utiliser dans d'autres projets.C'est un peu complexe, cependant - vous avez déjà un UserControl, mais cela ne fonctionnera pas dans une bibliothèque. UserControls utilise le modèle codebehind - ils sont composés de deux fichiers, un balisage et un code. Les bibliothèques ne semblent pas prendre en charge le modèle codebehind, donc vous ne pouvez pas utiliser UserControl. Vous devez convertir ce contrôle utilisateur en contrôle Web.
Créez un nouveau projet de bibliothèque de classes. Ouvrez les propriétés du projet et définissez AssemblyName et Default Namespace à SpiffyLibrary.
Maintenant, nous devons convertir votre UserControl. Commencez par créer une classe dans votre nouvelle bibliothèque. Appelez-le SpiffyControl, tout comme votre contrôle utilisateur existant, mais faites-le hériter de System.Web.UI.WebControls.CompositeControl. Deuxièmement, ouvrez le code de votre contrôle utilisateur existant et copiez tout ce qui se trouve à l'intérieur de la classe. Puis revenez à la nouvelle classe et collez tout à l'intérieur. Si vous utilisez l'un des événements de contrôle standard, vous devrez peut-être renommer ces fonctions pour remplacer les événements appropriés. Par exemple,
protected void Page_Load(object sender, EventArgs e)
{
...
}
... doit devenir ...
protected override void OnLoad(EventArgs e)
{
...
base.OnLoad(e);
}
troisième (ce qui est la partie complexe), vous devez reproduire toutes les balises que vous aviez dans le fichier de balisage de SpiffyControl. Vous ne pouvez pas simplement le copier - à la place, vous devez remplacer la fonction CreateChildControls() héritée de CompositeControl. Chaque balise que vous avez dans le balisage doit être instanciée comme une variable et ajoutée à la collection Controls de la classe. Ainsi, par exemple, si votre fichier de balisage existant ressemblait à ceci:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="SpiffyControl.ascx.cs" Inherits="Controls_SpiffyControl" %>
<div id="Div1" runat="server">
<asp:Label ID="TextOutput" runat="server" />
</div>
... alors votre nouvelle fonction CreateChildControls devrait ressembler à ceci:
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();
}
Notez que les contrôles sont déclarés comme des champs de classe; De cette façon, ils sont visibles pour toutes les méthodes de classe. Une fois votre balisage converti, compilez le projet de bibliothèque et ajoutez-le aux références de votre projet de site Web. Ensuite, ouvrez le fichier web.config de votre site Web et recherchez la section system.web/pages/controls. Cette section devrait déjà avoir une balise comme ceci:
<add tagPrefix="asp" namespace="System.Web.UI" assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
Cette balise est ce qui vous permet d'utiliser les contrôles des bibliothèques centrales ASP. Nous allons donc ajouter un peu comme ça, pour notre bibliothèque:
<add tagPrefix="spiffy" namespace="SpiffyLibrary" assembly="SpiffyLibrary" />
maintenant partout dans votre site, vous pouvez mettre dans le balisage comme ceci:
<spiffy:SpiffyControl ID="SpiffyInstance" runat="server" />
... et qui chargez votre contrôle Web à partir de votre bibliothèque personnalisée.
Vous pouvez utiliser LoadControl, mais le convertir. SpiffyControl spiffy = (SpiffyControl) LoadControl ("usercontrol.ascs"); – Geoff
Le problème est que je ne peux pas accéder au type SpiffyControl, donc je ne peux pas non plus le lancer - si je pouvais le lancer, je pourrais simplement l'instancier. –
Pourquoi ne pouvez-vous pas accéder au type SpiffyControl? – Jonas