49 votes

Combinez ASP.Net MVC avec WebForms

Serait-il possible de créer un MVC racine de l'application (Portail avec masterpages et thèmes) et ajouter un couple de WebForms en fonction des sous-projets (nous avons déjà un existant Formulaires de demande que nous aimerions intégrer dans le Portail)?

Comment feriez-vous pour centraliser la navigation (sitemaps, le routage d'url)?
Comment voulez-vous partager les masterpages?
Comment voulez-vous référer à des ressources (~ etc.)?

Des Solutions comme celle décrite ici semble un peu obsolète

48voto

jeroenh Points 12777

Combinant des formulaires web avec MVC est tout à fait possible. Voir cet article de blog de Scott, Hanselman pour une introduction.

31voto

Matt Points 61

Pour référence, j'ai réussi à accomplir cette tâche hier - ajouter MVC de la fonctionnalité existante de Formulaires web site web, c'est-à - donc pensé que je pourrais écrire dans le cas où il est utile à personne.

Les gens disent: "la meilleure façon est de réécrire votre application web forms comme MVC" mais il n'y a souvent aucun cas commercial en faveur de ce lorsque l'application est bien établie et a grandi au fil du temps pour être tout à fait un monstre (qui fonctionne toujours bien, je pourrais ajouter). Dans mon cas, il nous avait été demandé de mettre en œuvre une nouvelle fonction dans cette application, et avoir un développement en MVC sur d'autres projets, récemment j'ai voulu construire cette nouvelle fonction dans le MVC. C'est ce que j'ai fait:

  1. Créer un nouveau ASP.NET MVC 4 Application et sélectionné le Modèle Vide (avec Rasoir)

  2. Une fois chargé, clic droit, Références > Parcourir et navigué à la Corbeille le dossier de mon site web. J'ai ensuite ajouté dans la DLL, j'ai été en utilisant dans le site existant. Pour référence, je suis en utilisant AjaxControlToolkit donc décidé d'y ajouter plus tard un de NuGet. Cela devrait alors automatiquement mise à jour sur le web.fichier de configuration

  3. J'ai ensuite ouvert l'Explorateur Windows et naviguez vers le dossier racine de mon site web. À l'aide de Visual Studio, j'ai ensuite copié le dossier de niveau supérieur de la structure du site existant (moins le dossier Bin) résultant dans les 2 sites ayant la même dossiers de niveau supérieur (mais le nouveau projet de la MVC App_Start, les Contrôleurs, les Modèles et les Vues des dossiers aussi, mais pas Bin évidemment).

  4. Une fois le programme d'installation, j'ai copié les sous-dossiers et des fichiers à partir de la correspondante du dossier de niveau supérieur dans l'Explorateur Windows et collé dans la solution. Si vous le faites de la sorte, le projet permet de copier dans les sous-dossiers et le contenu directement, l'ajout d'un élément existant via visual studio, seulement des copies de fichiers ainsi gagner du temps. Veuillez noter: pour le dossier racine, je n'ai PAS de copie de site web.config ou Mondial.asax, copié, mais dans tous les autres fichiers (comme par défaut.aspx, etc)

  5. Une fois que tout le contenu a été copié, j'ai ouvert web.config dans le nouveau projet et web.config dans le site existant. J'ai copié dans le nouveau site web.config quelque chose de spécifique sur le site existant (appSettings, connectionStrings, les espaces de noms, de membres, d'informations, etc). De même pour le Mondial.asax fichiers.

  6. J'ai tenté de construire et de fixe, rien de ce que j'avais raté.

  7. Une fois que tout était bon (et j'avais abattu un peu de Jaune d'écrans de la mort), j'ai remarqué que j'ai trouvé la page ne trouve pas d'erreur lors du chargement par défaut.aspx. Cela représente une baisse de routage, voici les modifications que j'ai apportées à l'Acheminement d'informations (situé dans le Mondial.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 chargé et a couru comme il l'a toujours fait, mais j'ai maintenant un ASP.NET WebForms et MVC hybride. Je suis sûr qu'il ya probablement plus facile façons d'accomplir cette tâche, mais j'ai essayé d'autres méthodes et d'échec. De cette façon m'a pris environ 20 minutes et j'ai été en cours d'exécution... eh bien assis et codage :)

5voto

Odd Points 2747

Grande réponse ci-dessus. L'autre chose que vous pourriez envisager est de migrer de ASP.NET à ASP.NET MVC, auquel cas ce poste pourrait vous aider à migrer les fichiers de projet.

-1voto

user2879929 Points 6

Vérifiez ce lien. J'espère que ça aide!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X