web-dev-qa-db-fra.com

Est-il possible d'accéder aux vues MVC situées dans un autre projet?

Je souhaite séparer mon projet MVC en plusieurs projets

Alors tout d'abord, j'ai créé deux projets Front et Views

Le projet Front est une application Web qui contient des contrôleurs et des modèles

Le projet Vues est un projet de bibliothèque de classes qui ne contiendra que les vues

Ma question est de savoir comment faire en sorte que les contrôleurs appellent des vues situées dans le projet Vues

J'ai des contrôleurs comme celui-ci:

public ActionResult Default()
        {
            return this.View();
        }
24
Mehdi Souregi

MVC ne compile pas les vues dans les DLL, mais les référence à la place sous forme de fichiers à partir de la racine du répertoire de votre site. L'emplacement, par convention, est ~/Vues et un chemin de recherche est suivi. Ceci est plus ou moins codé en dur dans les moteurs de visualisation par défaut.

Étant donné que les vues sont des fichiers, lorsque vous les divisez en un projet distinct, elles n'existent pas dans votre projet d'application Web principal. Ainsi, le moteur de vue ne peut pas les trouver. Lorsque vous compilez l'application, tout projet référencé copiera uniquement les DLL (et potentiellement quelques autres choses, comme les pdb, etc.)

Maintenant, il existe des moyens de contourner ce problème, mais pour être honnête, ils posent généralement plus de problèmes qu'ils n'en valent la peine. Vous pouvez vous pencher sur les "zones portables" dans le projet mvc contrib, mais celles-ci ne sont pas bien prises en charge et il a été question de les remplacer par un emballage NuGet.

Vous pouvez également suivre les conseils de @ mo.esmp et créer un moteur de vue personnalisé, mais vous devrez toujours trouver des moyens de copier les vues là où le site peut y accéder lors de la construction et/ou du déploiement.

Ma suggestion serait de NE PAS décomposer les projets de la manière que vous décrivez. Je n'y vois aucune valeur. Si votre projet devient si volumineux, je séparerais plutôt votre code en zones, et garderais tous votre code régional et vos données ensemble.

Quelle valeur y a-t-il à séparer des éléments qui sont clairement dépendants les uns des autres en assemblages séparés dont le seul but est de collecter des objets en fonction de leur objectif? Je vois une certaine valeur dans la séparation des modèles dans leur propre projet, car les modèles peuvent être utilisés par plusieurs assemblages. Cependant, les contrôleurs et les vues ne sont utilisés que par le site principal MVC.

31
Erik Funkenbusch

Pour inclure des contrôleurs, vous devez modifier vos enregistrements d'itinéraire pour leur indiquer où chercher les contrôleurs:

routes.MapRoute(name: "Default", url: "{controller}/{action}/{id}",
                namespaces: new[] {"[Namespace of the Project that contains your controllers]"},
                defaults: new {controller = "Home", action = "Index", id = UrlParameter.Optional});

pour inclure View, vous créez un ViewEngine personnalisé:

public class CustomViewEngine: RazorViewEngine
{
    public CustomViewEngine()
    {
        MasterLocationFormats = new string[]
        {
            "~/bin/Views/{1}/{0}.cshtml",
            "~/bin/Views/{1}/{0}.vbhtml",
            "~/bin/Views/Shared/{0}.cshtml",
            "~/bin/Views/Shared/{0}.vbhtml"

        };
        ViewLocationFormats = new string[]
        {
             "~/bin/Areas/{2}/Views/{1}/{0}.cshtml",
             "~/bin/Areas/{2}/Views/{1}/{0}.vbhtml",
             "~/bin/Areas/{2}/Views/Shared/{0}.cshtml",
             "~/bin/Areas/{2}/Views/Shared/{0}.vbhtml"
        };
        .
        .
        .
    }
}
protected void Application_Start()
{
    ViewEngines.Engines.Add(new CustomViewEngine());

pour plus d'informations, consultez l'implémentation par défaut de RazorViewEngin.

Voici quelques bons articles:

Stockage des vues des contrôleurs ASP.NET MVC dans des assemblys séparés

ASP.NET MVC: placer vos contrôleurs dans un assemblage séparé

Comment appeler des contrôleurs dans des assemblys externes dans une application ASP.NET MVC

54
Mohsen Esmailpour

Vous pouvez précompiler vos vues - de cette façon, elles sont incluses dans la DLL et vous pouvez les référencer à partir d'un autre projet.

Comment faire:

  1. Déplacer les vues vers un autre projet
  2. Installer l'extension Razor Generator dans Visual Studio
  3. Remplacez l'outil personnalisé par RazorGenerator pour ces vues
  4. Ajouter le package NuGet RazorGenerator.Mvc au projet de vue
  5. Projet de vue de référence de votre projet principal

C'est ça!

Bien que vous deviez faire quelque chose avec vos modèles, soit les assembler avec des vues, soit avoir un troisième projet pour eux - sinon vous aurez une dépendance circulaire.

Un autre inconvénient est que tous ceux qui travailleront avec les vues auront besoin de cette extension Razor Generator.

La façon dont cela fonctionne consiste essentiellement à faire en sorte que Visual Studio génère des fichiers .cs à partir de vos vues au moment du design et ceux-ci font partie de la DLL compilée, comme tout autre morceau de code.

5
solo