Comment convertir le site Web ASP.NET en application Web ASP.NET

90

J'ai un site Web ASP.NET 3.5 (jargon du studio visuel), mais le site continue de croître et semble plutôt cowboy, entre autres. J'aimerais voir cela converti en une application Web (espaces de noms et tout).

Est-ce quelque chose qui peut être facilement réalisé dans Visual Studio? Sinon, existe-t-il d'autres outils qui pourraient créer automatiquement tous les espaces de noms, etc.

RSolberg
la source
4
Ce modèle de site Web est un point de vente vraiment horrible par rapport au modèle d'application Web. Je ne vois aucun avantage à utiliser le modèle de site Web ...
James
9
@James - juste une des nombreuses raisons pour lesquelles je cherche à m'en éloigner ... Vous
prêchez
2
Je suis sûr que la procédure ci-dessous est très complète (je n'ai pas tout lu), mais une personne sur YouTube a montré un moyen très simple de convertir un site Web en application Web ici: youtube.com/watch?v=oXptokM0v7w - comme d'habitude, je ne peux pas garantir que cela fonctionnera pour tout le monde. Je pense que cette méthode fonctionnera pour les personnes ayant des sites plus petits et moins compliqués.
dyslexicanaboko
3
Si vous utilisez VS2013, n'oubliez pas que l'élément de menu a été déplacé .
Jon

Réponses:

108

Eh bien, il s'avère que l'option "Convertir en application Web" n'existe PAS pour les "sites Web". L'option "Convertir en application web" n'existe que pour les "applications web" !!!!

[c'est moi qui souligne]

Alors, voici l'affaire, pour faire la conversion, vous devez:

  • Ajoutez une nouvelle «application Web» à votre solution VS 2008 (Fichier-> Ajouter-> Nouveau projet-> C # -> Web-> Application Web ASP.NET).

  • Ensuite, vous copiez tous les fichiers de l'ancien "site Web" dans votre "application Web" nouvellement créée et remplacez tous les fichiers créés par défaut.

  • L'étape suivante est la plus moche, vous devez ajouter «manuellement» les références de votre «site Web» à la nouvelle «application Web». Je pensais que le jouet VS 2008 PowerCommands ferait cela pour moi car il copie les références d'autres types de projets, mais ce n'est pas le cas. Vous devez le faire vous-même, manuellement, et vous devez être prudent dans cette étape si vous avez plusieurs versions du même assembly (comme AJAXToolkit dans mon cas) ou des assemblys qui ont à la fois des versions GAC et locales ou plus.

  • Continuez à répéter la dernière étape et essayez de créer "l'application Web". Vous continuerez à recevoir des erreurs telles que "'....' est un espace de noms inconnu. Vous manquez une référence d'assembly?". Assurez-vous que vous n'en avez aucun, sauf ceux où «....» est remplacé par les ID des contrôles serveur que vous utilisez. En d'autres termes, continuez à ajouter des références et à créer le projet jusqu'à ce que seules les erreurs qui existent en raison de fichiers .DESIGNER.CS ou .DESIGNER.VB manquants.

  • Ensuite, allez sur le nœud de projet racine "application web" dans l'explorateur de solutions VS 2008, et faites un clic droit dessus, puis vous trouverez l'option "Convertir en application web". Cette option fait en fait de petites modifications aux directives «@Page» et «@Control» des pages et des contrôles, et crée les fichiers .DESIGNER.CS ou .DESIGNER.VB requis.

  • Essayez de créer à nouveau "l'application Web". Si vous obtenez des erreurs, voyez quelles références peuvent manquer et / ou cliquez à nouveau sur "Convertir en application Web". Parfois, s'il y a une erreur autre que celles causées par des fichiers DESIGNER manquants, les fichiers DESIGNER ne seront pas créés pour toutes les pages / contrôles. Corriger le problème non DESIGNER et cliquer à nouveau sur "Convertir en application Web" devrait faire le travail pour cela.

  • Une fois que vous avez terminé la construction VS réussie, vous devriez être prêt à partir. Commencez à tester votre application Web. Si vous le souhaitez, vous pouvez cliquer avec le bouton droit de la souris sur le nœud du projet racine «application Web» dans l'explorateur de solutions VS 2008 et cliquer sur «Propriétés», puis aller dans l'onglet «Web» pour définir «l'application Web» dans un dossier virtuel dans IIS (vous pouvez créer un nouveau répertoire virtuel à partir de là dans VS). Si vous souhaitez utiliser le répertoire virtuel IIS utilisé par l'ancien «site Web», vous devez d'abord le supprimer d'IIS.

  • Mise à jour: Lorsque vous testez vos pages, faites PLUS ATTENTION aux classes du dossier "App_Code", en particulier à celles qui n'ont PAS DE NAMESPACE. Cela peut être un gros piège. Nous avons eu un problème avec deux surcharges de méthode d'extension dans la même classe statique qui n'avait pas d'espace de noms, une étend DateTime? (Nullable) et appelle une autre surcharge qui étend DateTime lui-même. L'appel de l'autre surcharge comme méthode d'extension a réussi la compilation VS 2008 et nous a donné une erreur de compilation UNIQUEMENT EN RUNTIME (avec IIS). Changer l'appel à l'autre surcharge de l'appel en tant que méthode d'extension à l'appel en tant que méthode statique normale (ne changeant que l'appel dans la même classe, les appels d'autres classes restaient des appels de méthode d'extension) a résolu celui-ci, mais clairement, ce n'est pas aussi sûr comme c'était le cas dans VS 2005.

  • Update2: Lors de la conversion, VS 2008 renomme votre "App_Code" en "Old_App_Code". Ce nouveau nom semble laid, mais NE LE RENOMMERZ PAS. Dans le modèle "application web", tout le code sera dans un seul assembly. Au moment de l'exécution, le serveur Web ne sait pas quel type de projet Web vous utilisez. Il prend tout le code dans le dossier "App_Code" et crée un nouvel assembly pour celui-ci. De cette façon, si vous avez du code dans le dossier nommé «App_Code», vous vous retrouverez avec des erreurs de compilation RUNTIME indiquant que les mêmes types existent dans deux assemblys, celui créé par VS et celui créé par IIS / ASP.NET Development Server . Pour éviter ça. laissez le "Old_App_Code" avec le même nom, ou renommez-le en N'IMPORTE QUEL SAUF: "App_Code". Ne placez aucun code dans un tel "App_Code"

Je sais cela depuis avant mais je l'ai oublié maintenant car je n'ai pas utilisé le modèle "site Web" depuis longtemps :(.

Andrew Hare
la source
2
Votre lien est rompu en haut, Erreur 500
Sameer Alibhai
6
Aussi, recherchez les fichiers de code à copier en tant que "contenu" et non "compiler"
jcolebrand
14
Pour ceux d'entre vous qui font cela sur VS2013, "Covert to Web App" a été déplacé vers le menu Projet, en bas.
Éric Sassaman
3
@EricSassaman Mais ce n'est pas du tout là pour moi des projets de site Web.
NickG
1
@NickG, vous avez raison, selon la première ligne de la réponse, il n'est PAS là pour les projets de site Web, le menu Projet n'existe même pas à moins que vous ne sélectionniez une application Web dans l'Explorateur de solutions. Si vous voyez "Site Web" dans le menu, ce n'est pas une application Web. Suivez les étapes ci-dessus pour créer une application Web vierge, copiez-y vos fichiers. Ensuite, "Convertir en application Web" devrait figurer dans le menu projet de votre nouvelle application Web. As-tu fais ça?
Eric Sassaman
5

Si vous rencontrez des problèmes pour créer votre nouveau projet d'application Web, vérifiez les propriétés de fichier dans Visual Studio de toutes les classes «d'assistance». Pour un projet, je convertissais l'action de construction a été définie sur Contenu alors qu'elle aurait dû être Compile.

Matt Burrell
la source
3

Créez une nouvelle application Web dans VS 2010.
1. À l'aide de l'Explorateur Windows, copiez tous vos fichiers dans votre dossier de projet.
2. Dans l'explorateur de solutions VS 2010, affichez tous les fichiers.
3. Sélectionnez les fichiers et les dossiers - cliquez avec le bouton droit sur inclure dans le projet.
4. Cliquez avec le bouton droit sur l'explorateur de solutions de projet et sélectionnez Convertir en application Web.

Il y a quelques petites différences, telles que le dossier App_Code sera renommé en old_app_code - cela ne provoque étonnamment aucune erreur. Le TypeName sur vos sources de données d'objet et les héritages de la balise @Page peuvent nécessiter le [ProjectName]. préfixe ajouté globalement. Par exemple, si votre nom de type était "BusinessLogic.OrderManager" et le nom de votre projet est InventorySystem, vous devrez le changer en InventorySystem.BusinessLogic.OrderManager. De plus, quelques changements d'affichage, tels que les validateurs de champs obligatoires ne sont plus par défaut en rouge, ils sont par défaut en noir.

Tim Samandari
la source
mon fichier de code d'application n'a pas changé comme il était supposé. J'ai dû le renommer manuellement puis changer toutes les pages cs à compiler.
Mike
3

J'étais confronté aux mêmes problèmes au départ. Après avoir suivi le livre Wrox Professional ASP.NET 4.0, j'ai trouvé la solution suivante pour mon cas.

J'ai d'abord créé une nouvelle application Web. Copie de tous les fichiers du site Web dans le dossier de l'application Web. Cliquez avec le bouton droit sur l'application et cliquez sur Convertir vers l'application Web.

Vous pourriez vous demander pourquoi vous devez convertir une application Web en application Web. La réponse est que lorsque vous créez un site Web, vous codez simplement le fichier .cs là où c'est nécessaire. Cependant, une application Web déclare automatiquement .design.cs (ou .vb) et un fichier .cs pour la section code et conception.

SUIVANT: Supprimez toutes les références manuelles, comme l'attribut «Inherits» dans la directive PAGE, à d'autres fichiers de votre site Web, car les espaces de nom se chargeront de référencer les classes de manière centralisée.

J'ai également rencontré un problème, car je n'avais pas inclus de dossier OBJ et BIN dans mon projet. Si vous pensez qu'il vous manque vos dossiers BIN et OBJ, cliquez simplement sur l'icône «Afficher tous les fichiers» dans l'Explorateur de solutions, puis cliquez avec le bouton droit sur les dossiers manquants et ajoutez au projet. (pour s'assurer qu'ils compilent avec le projet.)

MISE À JOUR: Comme @deadlychambers le souligne dans les commentaires: Vous pouvez rechercher partout en faisant un "Ctrl + Shift + F" puis rechercher Inherits="(.*?)". Cela trouvera toutes les occurrences et vous fera probablement gagner du temps!

Sunny R Gupta
la source
1
Vous pouvez tout supprimer avec Ctrl-Maj-F, puis modifier les options de recherche pour l'expression régulière et utiliser ce Inherits = "(. *)?"
DeadlyChambers
1
Vérifiez que c'est bien Inherits = "(. *?)", L'autre récupérera tout ce qui se trouve derrière l'héritage jusqu'au dernier guillemet.
DeadlyChambers
1
Je viens de rencontrer un problème où le fait de ne pas avoir d'héritage a obligé le concepteur à supprimer l'espace de noms, puis à supprimer la classe. Je souhaite que ce soit plus facile.
DeadlyChambers
3

J'ai maintenant migré avec succès un projet de site Web vers une application Web et il y a quelques pièges à surveiller.

Avoir ReSharper à votre disposition aide beaucoup à refactoriser les fichiers aspx.

  1. Configurez votre solution et créez une WebApplication vide
  2. Copier tout le fichier
  3. Les fichiers aspx dans les projets de site Web n'ont pas d'espace de nom. Enveloppez vos classes dans les espaces de noms appropriés
  4. Pendant la copie, toutes mes pages dans les sous-dossiers ont été renommées avec le nom de mon projet et le nom du dossier, donc j'ai obtenu 40ish public partial class FolderName_Projectname : PageSi nécessaire, renommer tous les fichiers en utilisant Resharper ou manuellement. Si vous rencontrez plusieurs erreurs telles que "There is already a member Page_Load() defined", cela est probablement dû à des noms de classe incorrects et à une duplication
  5. Après avoir ajouté un espace de noms
  6. Remplacez CodeFiletoutes les pages aspx par Codebehindet faites particulièrement attention aux fichiers de votre sous-dossier. Assurez-vous Inhertis=""que ne contient pas le chemin relatif. Vos espaces de noms s'occupent de tout. Le format correct est donc Inherits="Namespace.classname". Si votre classe a un espace de noms NaSpa et un nom de fichier foo.cs, ce seraitInherits="NaSpa.foo"

  7. Après avoir préparé tous vos fichiers (n'oubliez pas vos pages maîtres), lancez "Convertir en application Web". Si vous rencontrez des erreurs par la suite, rincez et répétez. Si vous rencontrez des erreurs du type "TextBoxName ne peut pas être trouvé s'il vous manque une référence", assurez-vous de ne pas oublier de nettoyer vos pages aspx. Un bon indicateur est de vérifier les fichiers de concepteur générés automatiquement. Si TextBoxNamen'apparaît pas là-dedans, la conversion n'a pas réussi complètement.

  8. Résolvez toutes les dépendances manquantes.
  9. Construire
Marco
la source
0

l'espace de nom ASP par défaut ne semble plus fonctionner. Je n'arrive donc pas à appeler mes pages User Controls.ascx depuis l'extérieur de la page. Leur donner un espace de noms et changer la valeur par défaut d'ASP en mon espace de noms semblait fonctionner.

Mike
la source