2009-08-17 14 views
8

Sto provando a caricare in modo dinamico un controllo utente in un sito asp.web. Tuttavia a causa di come i progetti di siti Web asp.net sono impostati (credo), non sono in grado di accedere alla definizione del tipo del controllo utente.Carica dinamico di un controllo utente (ascx) in un sito Web asp.net

ottengo un messaggio dicendo che la mia classe HE_ContentTop_WebControl1 è: (? Vi manca un un riferimento all'assembly direttiva using o) che tipo o il nome dello spazio dei nomi 'HE_ContentTop_WebControl1' non è stato trovato

Qualsiasi idea di come questo potrebbe essere fatto funzionare? Ho tentato di utilizzare namespace ma mi sembra che i siti Web asp.net non siano progettati per funzionare con gli spazi dei nomi per impostazione predefinita. Sarei interessato a un approccio non namespace.

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

Non dimenticare che devi mettere il controllo caricato da qualche parte sulla pagina, ad es. un segnaposto. –

risposta

10

Assumendo il controllo esiste nello stesso assembly come progetto web, è necessario aggiungere una direttiva di riferimento nel file aspx,

esempio:

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

Ricorda che spesso occorrono alcuni minuti (o talvolta una compilazione) per IntelliSense.

+0

Grazie mille. Avevo pensato che il riferimento non fosse necessario se avessi indicato la posizione del file di codice. Sembrava un po 'ridondante aggiungere il file, ma di nuovo ho fatto un'ipotesi ... –

+0

Se hai a che fare con un sacco di controlli utente, non consiglierei questo approccio. Nella mia esperienza, la soluzione per aggiungere gli usercontrols a un namespace e caricarli dinamicamente è molto più versatile. – Tchami

+0

Sì, è un po 'ridondante ma fondamentalmente la direttiva di riferimento è per ASP.NET in modo che possa effettivamente risolvere il cast su Page.LoadControl al momento opportuno. Felice di poterti aiutare! – jscharf

7

Può essere facilmente eseguito utilizzando i namespace. Ecco un esempio:

WebControl1.ascx:

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

noti che Eredita riferimenti dello spazio dei nomi (MyUserControls), e non solo il nome della classe (WebControl1)

WebControl1.ascx.cs:

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

     } 
    } 
} 

notato che la classe sono stati inclusi nelle MyUserControls namespace

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

Questo approccio potenzialmente consente di ridistribuire i controlli utente (o tenerli in un progetto separato) senza il fastidio di loro riferimento nei file aspx.

+0

Dove inserire questo file ascx? Se lo metto dove non posso importare uno spazio dei nomi a meno che non metto la directory app_code. Se inserisco la directory app_code, allora mi dà un errore non puoi metterlo lì –

+0

Cosa vuoi dire se non puoi importare un namespace? – Tchami

+0

spazio dei nomi MyUserControls .. Dove mettere il file ascx (in appcode o bin). Lo metto nella cartella dei controlli ma non riconosce lo spazio dei nomi MyUserControls. –

1

il riferimento non è sufficiente usando

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

nel file aspx è solo una parte della risposta.

è necessario anche aggiungere il calssName nel file di controllo utente aspx

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

e quindi è possibile utilizzare l'userontrol nel file aspx

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

Casting il controllo utente in questo modo può creare molti problemi. Il mio approccio è quello di creare una classe (ad esempio Control Class) mettere tutte le proprietà e il metodo necessari per eseguire il casting e ereditare questa classe da System.Web.UI.UserControl. Quindi nel file di codice utente cotrol invece di System .Web.UI.UserControl usa questa classe di controllo.

ora, quando mai hai bisogno di casting, lancia solo con questa classe. sarà anche il casting leggero.

2

Il tema di questo post è un po 'fuorviante. Se si desidera solo per aggiungere un controllo in modo dinamico, non sarà necessario fare riferimento al controllo e, pertanto, si può semplicemente aggiungere con qualcosa di semplice come:

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

senza Hassel namespace.

4

Gli spazi dei nomi non sono supportati nel modello di sito Web. Pertanto, non ho potuto ottenere nessuna delle soluzioni proposte per funzionare. Comunque, c'è una soluzione. Creare un'interfaccia e inserirla nel codice dell'app e quindi implementare l'interfaccia nel controllo utente. Puoi trasmettere all'interfaccia e funziona.

+0

Grazie, questo mi ha aiutato a implementare la soluzione di Tchami in un "sito web" su cui lavoro. Come hai detto, non ho potuto fare riferimento alla classe prima, ma con la tua spiegazione e il suggerimento di un'interfaccia, ora ha funzionato perfettamente! – Magnus

Problemi correlati