2009-08-17 8 views
8

J'essaie de charger dynamiquement un contrôle utilisateur dans un site asp.web. Cependant, en raison de la façon dont les projets de sites Web asp.net sont mis en place (je pense), je ne suis pas en mesure d'accéder à la définition de type du contrôle de l'utilisateur.Charger dynamiquement un contrôle utilisateur (ascx) dans un site Web asp.net

Je reçois un message disant que ma classe HE_ContentTop_WebControl1 est: (vous manque une directive à l'aide ou une référence d'assemblage) il dactylographier ou espace de nom « HE_ContentTop_WebControl1 » n'a pas pu être trouvé

Toute idée de comment cela pourrait être fait pour travailler? J'ai essayé d'utiliser l'espace de noms, mais il me semble que les sites Web asp.net ne sont pas conçus pour fonctionner avec les espaces de noms par défaut. Je serais intéressé par une approche sans nom.

TIA

public partial class HE_Default : 
    System.Web.UI.Page { 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     var control = (HE_ContentTop_WebControl1)Page.LoadControl("~/ContentTop/WebControl1.ascx");   
    } 
} 
+1

N'oubliez pas que vous devez également placer le contrôle chargé quelque part sur la page, par exemple. un espace réservé. –

Répondre

10

En supposant que le contrôle existe dans le même ensemble que votre projet web, vous devez ajouter une directive de référence dans votre fichier .aspx,

par exemple:

<%@ Reference Control="~/Controls/WebControl1.ascx"> 

Gardez à l'esprit qu'il faut souvent quelques minutes (ou parfois une compilation) pour qu'IntelliSense prenne cela en charge.

+0

Merci beaucoup. J'avais supposé que la référence n'était pas nécessaire si je désignais l'emplacement du fichier de code. Il semblait un peu redondant d'ajouter le fichier mais encore une fois j'ai fait une hypothèse ... –

+0

Si vous avez affaire à beaucoup de contrôles, je ne recommanderais vraiment pas cette approche. Dans mon expérience, la solution pour ajouter les commandes usercontrols à un espace de noms et ensuite les charger dynamiquement est beaucoup plus polyvalent. – Tchami

+0

Ouais, c'est un peu redondant, mais fondamentalement la directive de référence est pour ASP.NET afin qu'il puisse réellement résoudre le cast sur Page.LoadControl au moment opportun. Heureux d'avoir pu aider! – jscharf

7

Cela peut facilement être fait en utilisant des espaces de noms. Voici un exemple:

WebControl1.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebControl1.ascx.cs" Inherits="MyUserControls.WebControl1" %> 

Notez que Hérite l'espace de noms (références MyUserControls), et non pas seulement le nom de classe (WebControl1)

de WebControl1.ascx.cs:

namespace MyUserControls 
{ 
    public partial class WebControl1 : System.Web.UI.UserControl 
    { 
     protected void Page_Load(object sender, EventArgs e) 
     { 

     } 
    } 
} 

Notez que la classe ont été inclus dans l'espace de noms MyUserControls

Default.aspx.cs:

using MyUserControls; 

public partial class _Default : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     var control = (WebControl1) Page.LoadControl("~/WebControl1.ascx"); 
    } 
} 

Cette approche vous permet potentiellement de redistribuer vos contrôles utilisateur (ou les conserver dans un projet distinct) sans les tracas de leur référencement dans vos fichiers .aspx.

+0

Où mettre ce fichier ascx? Si je le mets n'importe où, je ne peux pas importer un espace de nom, sauf si je mets dans le répertoire app_code. Si je mets dans le répertoire app_code il me donne alors une erreur que vous ne pouvez pas mettre là –

+0

Que voulez-vous dire que vous ne pouvez pas importer un espace de noms? – Tchami

+0

nom espace MyUserControls .. Où mettre le fichier ascx (dans appcode ou bin). Je l'ai mis dans le dossier des contrôles mais il ne reconnaît pas l'espace de nom MyUserControls. –

1

la référence ne suffit pas en utilisant

<%@ Reference Control="~/Controls/WebControl1.ascx"> 

dans le fichier ASPX est juste une partie de la réponse.

vous devez également ajouter le calssName dans le fichier ASPX User Control

<%@ Control ClassName="WebControl1" Language="C#" AutoEventWireup="true" CodeFile="WebControl1.ascx.cs" Inherits="AnySpaceName.DateSelector" %> 

et vous pouvez utiliser le userontrol dans votre fichier ASPX

AnySpaceName.WebControl1 WC = (AnySpaceName.WebControl1)Page.LoadControl("~/WebControl1.ascx");  
1

Coulée du contrôle utilisateur de cette façon peut créer de nombreux problèmes .mon approche est de créer une classe (disons classe de contrôle) mettre toutes les propriétés et la méthode dont vous avez besoin pour la coulée et hériter de cette classe de System.Web.UI.UserControl. Puis dans votre fichier de code utilisateur cotrol au lieu de System .Web.UI.UserControl utilisateur cette classe de contrôle.

maintenant quand vous avez besoin d'un casting, cast avec cette classe seulement. Ce sera aussi un casting de lumière.

2

Le sujet de cet article est un peu trompeur. Si vous voulez juste ajouter un contrôle dynamique, vous ne devrez pas faire référence au contrôle et donc vous pouvez simplement ajouter quelque chose simple comme:

protected void Page_Load(object sender, EventArgs e) 
{ 
    Page.Controls.Add(Page.LoadControl("~/MyControl.ascx")); 
} 

sans Hassel espace de noms.

4

Les espaces de noms ne sont pas pris en charge par le modèle de site Web. En tant que tel, je ne pouvais obtenir aucune des solutions proposées pour fonctionner. Cependant, il y a une solution. Créez une interface et placez-la dans le code de l'application, puis implémentez l'interface dans le contrôle utilisateur. Vous pouvez lancer vers l'interface et cela fonctionne.

+0

Merci, cela m'a aidé à mettre en œuvre la solution de Tchami dans un "site web" sur lequel je travaille. Comme vous l'avez dit, je ne pouvais pas faire référence à la classe en premier, mais avec votre explication et la suggestion d'une interface, ça a fonctionné parfaitement! – Magnus

Questions connexes