2009-10-28 44 views
5

Sto convertendo un progetto 1.1 in 2.0 e sto avendo un problema con alcuni controlli utente.UserControls nella libreria di classi

Nel progetto originale, c'era un progetto di libreria di classi e il progetto di sito web. Nel progetto della libreria di classi c'era una cartella chiamata UserControls e in questo c'erano diversi file ascx e il loro codice dietro i file.

Mi piacerebbe mantenere la stessa struttura in modo da portare questi controlli utente nella mia nuova soluzione in un progetto di libreria di classi separato. L'ho modificato da classe intera a classe parziale e ho cambiato CodeBehind in CodeFile della pagina.

Nel vecchio controllo utente, tutti i controlli web nel controllo dell'utente sono stati elencati come segue

protected System.Web.UI.WebControls.DropDownList _findModeList; 

ecc

ho pensato con essendo Netto 2 e utilizzando l'attributo CodeFile invece, Potrei non aver bisogno di farlo ma non lo compilo quando lo ometto.

Tuttavia, quando lo includo, viene compilato, ma ottengo "Riferimento oggetto non impostato su un'istanza di un oggetto". errore durante il tentativo di utilizzare _findModeList nel file di codice.

È possibile inserire controlli utente in una libreria di classi in .net 2.0 in su?

risposta

3

Non proprio. Il file .ASCX deve essere incluso in ogni progetto di applicazione Web che lo utilizza. Per evitare duplicati è possibile memorizzare UserControl nella cartella della libreria di classi e utilizzare la funzionalità "Aggiungi come collegamento" di Visual Studio.

Selezionare "Aggiungi elemento esistente" nel menu di scelta rapida dell'applicazione Web, selezionare il controllo utente e, anziché fare clic sul pulsante "Aggiungi", fare clic sulla freccia in tale pulsante e selezionare "Aggiungi come collegamento".

1

Stai lavorando con un progetto di applicazione Web? O un sito Web? È confuso, lo so ...

Se stai lavorando con un WAP, usa CodeFile e lascia che ASP.NET generi i file .designer.cs per te. Non dichiarare gli oggetti dal tuo .acsx. Stai dichiarando un nuovo/diverso DropDownList quando dichiari esplicitamente _findModeList nel file .cs a cui fa riferimento CodeFile. Questo è il motivo per cui ottieni il riferimento null ... non è stato inizializzato. Se non si dispone di un file .designer, fare clic con il tasto destro del mouse su .ascx in Solution Explorer e fare clic su "Converti in applicazione Web".

Se si utilizza un sito anziché un WAP, utilizzare l'attributo CodeBehind. Continuerà a funzionare come in ASP.NET 1.1 e si compila al volo.

Per ottenere un controllo per vivere interamente in una DLL ... utilizzare "controlli personalizzati" anziché controlli utente. Di nuovo, confuso.

1

In realtà si può provare a creare nuova applicazione Progetto Web non Crea nuovo Sito Web, perché tra questi due sono altro progetto.

Dopo aver creato un'applicazione Web, è sufficiente creare il controllo utente (.ascx). Dopodiché puoi provare Ricostruisci la tua applicazione Web. Dopo aver finito puoi navigare nella tua directory bin, ci dovrebbe essere dll per la tua applicazione web. Ora puoi usare questa DLL in un altro sito web/progetto di applicazione web. Basta aggiungere un riferimento a questa dll.

1

Hai provato a modificare/aggiungere l'attributo Inherits nel tag <% @ Control%>?

<%@ Control Language="C#" CodeBehind="<PathToTheFile>" Inherits="namespace.and.classname" %> 
Problemi correlati