Come convertire il sito Web ASP.NET in un'applicazione Web ASP.NET


90

Ho un sito Web ASP.NET 3.5 (gergo di visual studio), ma il sito continua a crescere e tra le altre cose sembra piuttosto cowboy. Mi piacerebbe vederlo convertito in un'applicazione Web (spazi dei nomi e tutto il resto).

È qualcosa che può essere fatto facilmente in Visual Studio? In caso contrario, ci sono altri strumenti là fuori che potrebbero creare automaticamente tutti gli spazi dei nomi, ecc.?


4
Quel modello di sito Web è un POS davvero orribile rispetto al modello di applicazione Web. Non vedo alcun vantaggio nell'usare il template del sito web ...
James

9
@ James - solo uno dei tanti motivi per cui sto cercando di allontanarmene ... Stai predicando al coro ....
RSolberg

2
Sono sicuro che la procedura dettagliata di seguito è molto approfondita (non l'ho letta tutta), ma una persona su YouTube ha mostrato un modo molto semplice per convertire un sito Web in un'app Web qui: youtube.com/watch?v=oXptokM0v7w - as al solito non posso garantire che funzionerà per tutti. Penso che questo metodo funzionerà per le persone con siti più piccoli e meno complicati.
dyslexicanaboko

3
Se stai usando VS2013, non dimenticare che la voce di menu è stata spostata .
Jon

Risposte:


108

Ebbene, risulta che l'opzione "Converti in applicazione web" NON esiste per "siti web". L'opzione "Converti in applicazione web" esiste solo per "applicazioni web" !!!!

[enfasi mia]

Quindi, ecco l'affare, per fare la conversione, devi:

  • Aggiungere una nuova "applicazione Web" alla soluzione VS 2008 (File-> Aggiungi-> Nuovo progetto-> C # -> Web-> Applicazione Web ASP.NET).

  • Successivamente, copi tutti i file nel vecchio "sito web" nella tua "applicazione web" appena creata e sovrascrivi tutti i file creati al suo interno per impostazione predefinita

  • Il passo successivo è il più brutto, devi aggiungere "manualmente" i riferimenti nel tuo "sito web" alla nuova "applicazione web". Pensavo che il giocattolo PowerCommands VS 2008 avrebbe fatto questo per me in quanto copia i riferimenti da altri tipi di progetto, ma non è stato così. Devi farlo da solo, manualmente, e devi essere cauto in questo passaggio se hai più versioni dello stesso assembly (come AJAXToolkit nel mio caso) o assembly che hanno sia GAC ​​che versioni locali o giù di lì.

  • Continua a ripetere l'ultimo passaggio e prova a creare l '"applicazione web". Continuerai a ricevere errori come "'....' è uno spazio dei nomi sconosciuto. Ti manca un riferimento all'assembly?". Assicurati di non avere nessuno di quelli tranne quelli in cui "...." è sostituito dagli ID dei controlli del server che utilizzi. In altre parole, continuare ad aggiungere riferimenti e creare il progetto fino a quando non vengono visualizzati solo gli errori a causa della mancanza di file .DESIGNER.CS o .DESIGNER.VB.

  • Successivamente, vai al nodo del progetto radice "applicazione web" in Esplora soluzioni VS 2008 e fai clic con il pulsante destro del mouse, quindi troverai l'opzione "Converti in applicazione web". Ciò che questa opzione fa è effettivamente apportare piccole modifiche alle direttive "@Page" e "@Control" di pagine e controlli e creare i file .DESIGNER.CS o .DESIGNER.VB richiesti.

  • Prova a creare di nuovo l '"applicazione web". Se si verificano errori, vedere quali riferimenti potrebbero mancare e / o fare nuovamente clic su "Converti in applicazione web". A volte, se si verificano errori diversi da quelli causati dalla mancanza di file DESIGNER, non tutte le pagine / controlli avranno quei file DESIGNER creati per loro. Risolvere il problema non DESIGNER e fare di nuovo clic su "Converti in applicazione web" dovrebbe funzionare per questo.

  • Dopo aver completato con successo la build VS, dovresti essere pronto per iniziare. Inizia a testare la tua applicazione web. Facoltativamente, è possibile fare clic con il pulsante destro del mouse sul nodo del progetto principale "applicazione web" in VS 2008 Solution Explorer e fare clic su "Proprietà", quindi andare alla scheda "Web" per impostare l '"applicazione web" su una cartella virtuale in IIS (è possibile creare una nuova directory virtuale da lì in VS). Se si desidera utilizzare la directory virtuale IIS utilizzata dal vecchio "sito Web", è necessario prima rimuoverla da IIS.

  • Aggiornamento: quando provi le tue pagine, presta MASSIMA ATTENZIONE alle classi nella cartella "App_Code", specialmente quelle senza NAMESPACE. Quelle possono essere una grande trappola. Abbiamo avuto un problema con due overload del metodo di estensione nella stessa classe statica che non aveva spazio dei nomi, uno estende DateTime? (Nullable) e chiama un altro overload che estende lo stesso DateTime. La chiamata dell'altro overload come metodo di estensione ha superato la compilazione VS 2008 e ci ha fornito un errore di compilazione SOLO IN RUNTIME (con IIS). Cambiare la chiamata all'altro overload dal chiamarlo come metodo di estensione a chiamarlo come normale metodo statico (cambiando solo la chiamata nella stessa classe, le chiamate da altre classi sono rimaste chiamate al metodo di estensione) ha risolto questo problema, ma chiaramente, non è così sicuro come lo era in VS 2005.

  • Update2: durante la conversione, VS 2008 rinomina "App_Code" in "Old_App_Code". Questo nuovo nome sembra brutto, ma NON RINOMINARLO. Nel modello "applicazione web", tutto il codice sarà in un assembly. In runtime, il server web non sa quale tipo di progetto web stai utilizzando. Prende tutto il codice nella cartella "App_Code" e crea un nuovo assembly per esso. In questo modo, se hai del codice nella cartella denominata "App_Code", ti ritroverai con errori di compilazione RUNTIME che gli stessi tipi esistono in due assembly, quello creato da VS e quello creato da IIS / ASP.NET Development Server . Per evitarlo. lascia "Old_App_Code" con lo stesso nome o rinominalo in QUALSIASI COSA TRANNE: "App_Code". Non inserire alcun codice in tale "App_Code"

Lo so da prima, ma ora l'ho dimenticato perché non ho usato a lungo il modello "sito web" :(.


2
Il tuo collegamento è interrotto in alto, Errore 500
Sameer Alibhai

6
Inoltre, cerca i file di codice da copiare come "contenuto" e non "compilare"
jcolebrand

14
Per quelli di voi che lo fanno su VS2013, "Covert to Web App" è stato spostato nel menu Progetto, in basso.
Eric Sassaman

3
@EricSassaman Ma non c'è affatto per i progetti di siti Web per me.
NickG

1
@ NickG, hai ragione, come per la prima riga della risposta, NON è presente per i progetti di siti Web, il menu Progetto non esiste nemmeno a meno che non selezioni un'applicazione Web in Esplora soluzioni. Se vedi "Sito web" nel menu, non è un'applicazione web. Seguire i passaggi precedenti per creare un'applicazione Web vuota, copiare i file in essa. Quindi "Converti in applicazione Web" dovrebbe essere nel menu del progetto per la nuova applicazione Web. Sei stato tu?
Eric Sassaman


5

In caso di problemi durante la compilazione del nuovo progetto di applicazione Web, controllare le proprietà del file in Visual Studio di tutte le classi "helper". Per un progetto che stavo convertendo, l'azione Build era impostata su Content mentre avrebbe dovuto essere Compile.


3

Creare una nuova applicazione Web in VS 2010.
1. Utilizzando Windows Explorer, copiare tutti i file nella cartella del progetto.
2. In Esplora soluzioni VS 2010 mostra tutti i file.
3. Selezionare i file e le cartelle - fare clic con il tasto destro su includi nel progetto.
4. Fare clic con il pulsante destro del mouse su Esplora soluzioni di progetto e selezionare Converti in applicazione Web.

Ci sono alcune piccole differenze, ad esempio la cartella App_Code verrà rinominata in old_app_code, che sorprendentemente non causa errori. TypeName sulle origini dati dell'oggetto e le eredità sul tag @Page potrebbero richiedere [ProjectName]. prefisso aggiunto globalmente. Ad esempio, se il nome del tipo era "BusinessLogic.OrderManager" e il nome del progetto è InventorySystem, sarà necessario cambiarlo in InventorySystem.BusinessLogic.OrderManager. Inoltre, alcune modifiche al display, come i validatori dei campi obbligatori, non utilizzano più il carattere rosso, ma il nero.


il file del codice della mia app non è cambiato come avrebbe dovuto. Ho dovuto rinominarlo manualmente, quindi modificare tutte le pagine cs per compilare.
Mike

3

Inizialmente ho dovuto affrontare gli stessi problemi. Dopo aver seguito il libro Wrox Professional ASP.NET 4.0, ho trovato la seguente soluzione per il mio caso.

Per prima cosa ho creato una nuova applicazione web. Copiato tutti i file del sito Web nella cartella dell'applicazione Web. Fare clic con il tasto destro sull'applicazione e fare clic su Conver to web application.

Potresti chiedere perché è necessario convertire un'app Web in un'app Web. La risposta è che quando crei un sito web, codifichi semplicemente il file .cs dove richiesto. Un'applicazione web, tuttavia, dichiara automaticamente .design.cs (o .vb) e un file .cs per la sezione codice e design.

SUCCESSIVO: Rimuovi tutti i riferimenti manuali, come l'attributo "Inherits" nella direttiva PAGE, ad altri file nel tuo sito Web, poiché gli spazi dei nomi si occuperanno di fare riferimento alle classi centralmente.

Ho anche riscontrato un problema, poiché non avevo incluso la cartella OBJ e BIN nel mio progetto. Se pensi che ti manchino le cartelle BIN e OBJ, fai semplicemente clic sull'icona "Mostra tutti i file" in Esplora soluzioni, quindi fai clic con il pulsante destro del mouse sulle cartelle mancanti e aggiungi al progetto. (per assicurarsi che si compilino con il progetto.)

AGGIORNAMENTO: Come sottolinea @deadlychambers nei commenti: puoi cercare ovunque facendo "Ctrl + Maiusc + F" e quindi cercare Inherits="(.*?)". Questo troverà tutte le occorrenze e probabilmente ti farà risparmiare tempo!


1
Puoi rimuovere tutto con Ctrl-Maiusc-F, quindi modificare le opzioni di ricerca per l'espressione regolare e utilizzare questo Inherits = "(. *)?"
DeadlyChambers

1
Verifica che sia Inherits = "(. *?)", L'altro prenderà tutto ciò che sta dietro inherits fino all'ultima virgoletta.
DeadlyChambers

1
Mi sono appena imbattuto in un problema in cui NON avere eredità ha fatto sì che il designer eliminasse lo spazio dei nomi quindi eliminasse la classe. Vorrei che fosse più facile.
DeadlyChambers

3

Ora ho migrato con successo un progetto di sito Web a un'applicazione Web e ci sono alcuni trucchi a cui prestare attenzione.

Avere ReSharper a tua disposizione aiuta molto nel refactoring dei file aspx.

  1. Configura la tua soluzione e crea un'applicazione Web vuota
  2. Copia tutto il file
  3. I file aspx nei progetti di siti Web non hanno uno spazio dei nomi. Racchiudi le tue classi negli spazi dei nomi appropriati
  4. Durante la copia, tutte le mie pagine nelle sottocartelle sono state rinominate con il nome del mio progetto e il nome della cartella, quindi ho ottenuto 40ish public partial class FolderName_Projectname : PageSe necessario, rinomina tutti i file usando Resharper o manualmente. Se incontri più errori come"There is already a member Page_Load() defined" , molto probabilmente è dovuto a nomi di classi errati e duplicazione
  5. Dopo aver aggiunto uno spazio dei nomi
  6. Sostituisci CodeFilein tutte le pagine aspx con Codebehinde presta particolare attenzione ai file nella tua sottocartella. Assicurati che Inhertis=""non contenga il percorso relativo. I tuoi spazi dei nomi si prendono cura di tutto. Quindi il formato corretto è Inherits="Namespace.classname". Se la tua classe ha uno spazio dei nomi NaSpa e un nome di file foo.cs, lo sarebbeInherits="NaSpa.foo"

  7. Dopo aver preparato tutti i file (non dimenticare le pagine master), eseguire "Converti in applicazione web". Se si verificano errori in seguito, risciacquare e ripetere. Se incontri errori del tipo "TextBoxName non può essere trovato manchi un riferimento", assicurati di non aver dimenticato di disinfettare le tue pagine aspx. Un buon indicatore è controllare i file designer generati automaticamente. SeTextBoxName non appare lì, la conversione non è riuscita completamente.

  8. Risolvi eventuali dipendenze mancanti.
  9. Costruire

0

lo spazio dei nomi ASP predefinito non sembra funzionare più. Quindi non riesco a chiamare le mie pagine User Controls.ascx dall'esterno della pagina. Dare loro uno spazio dei nomi e modificare l'impostazione predefinita da ASP al mio spazio dei nomi sembrava funzionare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.