2010-05-10 10 views
10

È possibile compilare un progetto di applicazione Web .ascx (controllo utente) in una DLL?Compile progetto di applicazione web ascx in dll

voglio fare quanto segue:

  1. Utilizzare lo stesso controllo in più siti web
  2. Embed css e js come risorse nel controllo
  3. in grado di aggiornare super facile. Se gli aggiornamenti del controllo utente, voglio solo aggiornare 1. Dll

Ho seguito con successo questo articolo, http://msdn.microsoft.com/en-us/library/aa479318.aspx.

Tuttavia, ciò utilizza progetti di siti Web e non è possibile incorporare js css come risorse in progetti di siti Web.

Qualche idea? Sto andando su questo sbagliato, dovrei cambiare l'approccio?

+0

Avete analizzato la soluzione che ho incollato? Funziona molto bene per la creazione di una libreria di controllo utente. Eviterei la creazione della libreria di controllo utente, se possibile, come diciamo altri, ma se non hai nessuna opzione, guarda l'articolo –

risposta

3

È difficile utilizzare i controlli utente in questo modo a causa del file ascx markup. Se si desidera creare librerie di controllo riutilizzabili, è molto meglio creare controlli personalizzati.

+0

, aggiungo a questo, se il controllo utente non è altamente composito, allora questo è il minimo modo doloroso per andare. In effetti, ho rifattorizzato il codice in modo che i miei file ascx non fossero controlli compositi, in modo che fossero più facili da includere nei controlli del server, spesso ereditati da un controllo ASP.NET integrato. – MatthewMartin

+0

In questo caso la creazione di un controllo personalizzato non è realmente un'opzione, sto ricevendo il codice da una terza parte, che sto cercando di incorporare in 3 diversi siti web. Non ho il controllo su come ottengo il codice, e non voglio riscriverlo in un controllo personalizzato, tanto più che ogni aggiornamento che hanno dovrà essere riscritto. – cjburkha

+0

Piuttosto che provare a utilizzare i controlli utente di porgate in una dll a cui è possibile fare riferimento, è meglio utilizzare l'origine dei controlli utente in ogni app Web e mantenerli sincronizzati utilizzando il controllo del codice sorgente, ad esempio la funzione di estensioni di Subversion. http://justaddwater.dk/2007/10/23/setting-up-subversion-externals-with-tortoisesvn/ –

5

La conversione è semplice e potrebbe persino essere completamente automatizzata. Richiede semplicemente cambiando alcune impostazioni e le classi di base nel progetto DLL si desidera che i controlli incorporati in ASCX.

1 ... Per ogni UserControl, impostare Operazione di generazione del file ASCX (sotto Proprietà) per "Risorsa incorporata "ed elimina il suo file designer associato.

2 ... Salvare il progetto.

3 ... Fare clic con il pulsante destro del mouse sul progetto e selezionare "Scarica progetto".

4 ... Fare nuovamente clic con il pulsante destro del mouse e selezionare l'opzione "Modifica * .csproj".

Modifica sezioni che assomigliano a questo (dove l'asterisco rappresenta il nome della classe):

<Compile Include="*.ascx.cs"> 
    <DependentUpon>*.ascx</DependentUpon> 
    <SubType>ASPXCodeBehind</SubType> 
</Compile> 

a guardare come questo

<Compile Include="*.ascx.cs" /> 

che farà sì che i file code-behind per essere compilato in modo indipendente dei file ASCX.

5 ... Salvare le modifiche e fare clic con il pulsante destro del mouse sul progetto e selezionare "Ricarica progetto".

6 ... aperte tutti i tuoi "*" .ascx.cs file e renderli ereditano dalla seguente classe UserControl personalizzato, anziché la classe System.Web.UI.UserControl (potrebbe essere necessario individuare genitore classi per completare questo passaggio).

public class UserControl : System.Web.UI.UserControl 
{ 
    protected override void FrameworkInitialize() 
    { 
     base.FrameworkInitialize(); 
     string content = String.Empty; 
     Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(GetType().FullName + ".ascx"); 
     using (StreamReader reader = new StreamReader(stream)) 
      content = reader.ReadToEnd(); 
     Control userControl = Page.ParseControl(content); 
     this.Controls.Add(userControl); 
    } 
} 

Questa classe di base si occuperà del caricamento e dell'analisi del file ASCX incorporato.

7 ... Infine, potrebbe essere necessario inserire i file ASCX in sottocartelle in modo che i loro nomi delle risorse (determinato automaticamente dal percorso della cartella) corrispondono al nome di tipo completo della loro classe associata (plus "ascx"). Supponendo che lo spazio dei nomi di root corrisponda al nome del progetto, una classe denominata "ProjectName.Namespace1.Namespace2.ClassName" avrà bisogno del suo file ASCX in una sottocartella "Namespace1 \ Namespace2", quindi verrà incorporata con il nome "ProjectName.Namespace1.Namespace2. ClassName.ascx".

E questo è tutto! Una volta compilata la DLL e inserita in un altro progetto, è possibile creare un'istanza delle istanze dei controlli utente utilizzando l'operatore "nuovo", come qualsiasi altra classe. Come sempre, il tuo controllo verrà "catturato" all'evento di pagina corrente una volta aggiunto come controllo figlio alla pagina o ad un altro controllo sulla pagina.

+0

Ho provato a utilizzare questo approccio quando si crea un controllo veramente complesso, ma non ha funzionato. Apparentemente il problema è nel metodo ParseControl, che non può gestire espressioni di associazione dati come Eval e Bind. Qualche idea con questo? –

+0

Questo è abbastanza sorprendente. Sono riuscito a farlo funzionare con alcune modifiche. Il passaggio 7 non era richiesto, non gli piaceva avere sotto-dir per ogni spazio dei nomi, ma funzionava quando si trovava nella radice. Ogni controllo frontale doveva essere dichiarato/registrato manualmente tramite questo.FindControl ('litOutput'); e gli eventi dovevano essere registrati nel back-end. A parte questo, finora non ho avuto altri problemi! – Radderz

1

Un altro modo sarebbe convertire il controllo utente nel controllo personalizzato. C'è un bell'articolo su MSDN: Turning an .ascx User Control into a Redistributable Custom Control che descrive esattamente come farlo. Ecco il sommario:

  1. Scrivi il controllo utente come si farebbe normalmente, in genere utilizzando la progettazione di Visual Studio.
  2. Provalo usando una semplice pagina prima di provare a distribuirlo.
  3. Distribuire l'applicazione per eseguirne la precompilazione.
  4. Afferrare l'assembly del controllo utente prodotto dal passo di distribuzione, e in pratica si è fatto: si dispone del proprio controllo personalizzato.
  5. Infine, utilizzare il controllo personalizzato in altre app allo stesso modo di utilizzare sempre controlli personalizzati.

Spero che questo aiuti.

Problemi correlati