web-dev-qa-db-fra.com

Combinez ASP.Net MVC avec WebForms

Serait-il possible de créer une application racine MVC (Portal avec pages maîtres et thèmes) et d'ajouter quelques sous-projets basés sur WebForms (nous avons déjà une application WebForms existante que nous souhaitons intégrer au portail)?

Comment centraliseriez-vous la navigation (plans du site, routage des URL)?
Comment partageriez-vous les pages maîtres?
Comment feriez-vous référence aux ressources (~ problèmes, etc.)?

Des solutions comme celle décrite ici semblent un peu dépassées

41
Zyphrax

La combinaison de formulaires Web avec MVC est tout à fait possible. Voir cet article de Scott Hanselman pour une introduction. 

42
jeroenh

Pour référence, j’ai réussi à accomplir cette tâche hier: ajouter la fonctionnalité MVC à un site Web WebForms existant, c’est-à-dire, donc j’aurais pensé pouvoir écrire au cas où cela serait utile à n’importe qui.

Les gens disent: "le meilleur moyen est de réécrire votre application de formulaires Web en tant que MVC", mais il n'y a souvent aucune analyse de rentabilisation à cela lorsque l'application est bien établie et qu'elle a évolué avec le temps pour devenir un véritable monstre (cela fonctionne toujours, pourrais-je ajouter ). Dans mon cas, on nous avait demandé d'implémenter une nouvelle fonction dans cette application (et ayant récemment développé MVC sur d'autres projets), je souhaitais construire cette nouvelle fonction dans MVC. C'est ce que j'ai fait:

  1. Créez une nouvelle Application ASP.NET MVC 4 et sélectionnez le modèle Modèle vide (avec Razor)

  2. Une fois chargé, cliquez avec le bouton droit de la souris sur Références > Parcourir, puis accédez au dossier Bin de mon site Web existant. J'ai ensuite ajouté la DLL que j'utilisais sur le site existant. Pour référence, j'utilise AjaxControlToolkit alors décidé d’ajouter le dernier de NuGet. Cela devrait ensuite mettre à jour automatiquement le fichier web.config

  3. J'ai ensuite ouvert Explorateur Windows et navigué vers le dossier racine de mon site Web existant. À l’aide de Visual Studio, j’ai ensuite répliqué la structure de dossiers de niveau supérieur du site existant (moins le dossier Bin), les deux sites ayant les mêmes dossiers de niveau supérieur (mais le nouveau projet possédant MVC App_Start, Controllers). , Modèles et vues également, mais pas Bin évidemment).

  4. Une fois la configuration terminée, j'ai copié les sous-dossiers et les fichiers du dossier de niveau supérieur correspondant dans Explorateur Windows et les ai collés dans la solution. Si vous le faites normalement, le projet vous permet de copier directement dans les sous-dossiers et le contenu, en ajoutant un élément existant via Visual Studio uniquement aux copies dans les fichiers, ce qui permet de gagner du temps. Remarque: pour le dossier racine, je n'ai pas copiéPASdans web.config ou Global.asax , mais copié dans tous les autres fichiers (comme default.aspx, etc.).

  5. Une fois tout le contenu copié, j'ai ouvert web.config dans le nouveau projet et web.config dans le site existant. J'ai copié dans le nouveau web.config tout ce qui est spécifique au site Web existant (appSettings, connectionStrings, espaces de noms, informations d'adhésion, etc.). La même chose s'applique aux fichiers Global.asax.

  6. J'ai essayé de construire et de réparer tout ce que j'avais manqué.

  7. Une fois que tout était correct (et que j'avais abattu quelques écrans jaunes de la mort), j'ai remarqué que l'erreur de page non trouvée s'était produite lors du chargement/ default.aspx . Ceci est dû au routage, voici les modifications que j'ai apportées aux informations de routage (situées dans Global.ascx MVC 3 ou App_Start> RouteConfig.cs MVC 4):

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    
        // This informs MVC Routing Engine to send any requests for .aspx page to the WebForms engine
        routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
        routes.IgnoreRoute("{resource}.aspx");
    
        // Important change here: removed 'controller = "Home"' from defaults. This is the key for loading
        // root default page. With default setting removed '/' is NOT matched, so default.aspx will load instead
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { action = "Index", id = UrlParameter.Optional }
        );
    }
    

Avec toutes ces mesures prises, le site s'est chargé et a fonctionné comme il l'a toujours fait, mais j'ai maintenant un hybride ASP.NET WebForms et MVC. Je suis sûr qu'il existe probablement des moyens plus simples d'accomplir cette tâche, mais j'ai essayé d'autres méthodes et j'ai échoué. Cela me prenait environ 20 minutes et j'étais opérationnel ... bien assis et codage :)

19
Matt

Grande réponse ci-dessus. Vous pouvez également envisager la migration d'ASP.NET vers ASP.NET MVC. Dans ce cas, ce message pourrait vous aider migrez les fichiers du projet.

5
Odd

J'étais trop coincé dans cette situation, après tout j'ai eu une solution qui a fonctionné, tout d'abord copier web.config dans votre dossier de vues.

Après avoir ouvert le fichier Route.config(Routeconfig), vous y trouverez une méthode RegisterRoutes, conservez-la telle quelle, créez une autre méthode nommée RegisterRoutes2() et copiez-collez le code de méthode ci-dessous à partir de l'application mvc:

public static void RegisterRoutes2(RouteCollection routes)
{...}

dans certains cas, le nom de la méthode dans l'application mvc serait RegisterRoutes . Si le code ci-dessus ne fonctionne pas, copiez-le et collez-le à partir de l'application mvc de votre machine . Ensuite, allez au fichier global.asax, vous verrez que RegisterRoutes() a été appelé, simple maintenant, appelez également RegisterRoutes2(). Et vous avez terminé, redémarrez votre application ou générez de nouveau, elle sera exécutée.

0
Hitesh Nagpal