8
votes

Charger dynamiquement un contrôle utilisateur (ASCX) dans un site Web ASP.NET

J'essaie de charger de manière dynamique un contrôle de l'utilisateur dans un site ASP.WEB. Cependant, en raison de la configuration de la configuration des sites Web ASP.NET (je pense), je ne suis pas en mesure d'accéder à la définition de type de type du contrôle de l'utilisateur.

Je reçois un message disant que ma classe He_ContentTop_webControl1 est: SE NOM DE TYPE OU NAME NAME "He_ContentTop_WebControl1" est introuvable (manquez-vous une directive à l'aide d'une référence ou d'une référence d'assemblage?)

aucune idée de la manière dont cela pourrait être fait pour fonctionner? J'ai tenté d'utiliser l'espace de noms, mais il me semble que les sites Web ASP.NET ne sont pas conçus pour fonctionner avec des espaces de noms par défaut. Je serais intéressé par une approche d'espace non-noms.

tia xxx


1 commentaires

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


6 Réponses :


10
votes

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

par exemple: xxx

À l'esprit, cela prend souvent quelques minutes (ou parfois une construction) pour que IntelliSense reprenne cela.


4 commentaires

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


Si vous avez affaire à beaucoup d'usercontrols, je ne recommanderais vraiment pas cette approche. Dans mon expérience, la solution pour ajouter les UserControls à un espace de noms puis les charger de manière dynamique est beaucoup plus polyvalente.


Oui, c'est un peu redondant mais fondamentalement la directive de référence est pour ASP.NET afin qu'elle puisse réellement résoudre la distribution de la page.loadControl à l'heure appropriée. Heureux d'avoir pu aider!


Ajouter une balise ci-jointe <% @ Control de référence = "~ / Controls / webcontrol1.ascx"%>



7
votes

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

webcontrol1.ascx: p> xxx pré>

remarque que hérités forte> Références L'espace de noms (myuserercontrols), et pas seulement le nom de la classe ( Webcontrol1) p>

webcontrol1.ascx.cs: p> xxx pré>

Notez que la classe a été incluse dans la catégorie Espace MySeControls P>

défaut. ASPX.CS: P>

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");
    }
}


4 commentaires

Où mettre ce fichier ASCX? Si je le mettais là où je ne peux pas importer un espace de nom à moins que je n'en mettit dans le répertoire App_code. Si je mettais dans l'annuaire App_code, cela me donne alors une erreur que vous ne pouvez pas la mettre là-bas


Que voulez-vous dire que vous ne pouvez pas importer d'espace de noms?


Nom Space Myusercontrols .. Où mettre le fichier ASCX (dans AppCode ou Bin). Je l'ai mis dans le dossier Controls mais cela ne reconnaît pas Nom Space Myusercontrols.


Upédé parce que cela résout le problème dans Visual Studio et Msbuild.



2
votes

La référence ne suffit pas à l'aide de

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


0 commentaires

1
votes

Casting de la commande de l'utilisateur de cette façon peut créer de nombreux problèmes .My approche consiste à créer une classe (par exemple la classe de contrôle) Placez toutes les propriétés et la méthode dont vous avez besoin pour la coulée et hériter de cette classe à partir de System.Web.UI.USERCONTROL .Ce dans votre fichier de code Cotrol au lieu de System.Web.UI.USERCONTROL Utilisateur de cette classe de contrôle.

Maintenant, lorsque vous avez besoin de casting, jeté uniquement avec cette classe. Ce sera également la lumière légère.


0 commentaires

3
votes

Le sujet de ce message est un peu trompeur. Si vous souhaitez simplement ajouter un contrôle de manière dynamique, vous n'aurez pas à référencer le contrôle et, par conséquent, vous pouvez simplement l'ajouter avec quelque chose de simple comme: xxx

sans espace de noms Hassel.


0 commentaires

4
votes

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


1 commentaires

Merci, cela m'a aidé à mettre en œuvre la solution de TCHAMI dans un «site Web» que je travaille. Comme vous l'avez dit, je ne pouvais pas faire référence à la classe d'abord, mais avec votre explication et votre suggestion d'une interface, elle fonctionnait maintenant parfaitement!