Tout d'abord, c'est certainement une bonne idée de placer votre modèle dans un projet séparé. Comme vous l'avez découvert, c'est trivial.
En ce qui concerne les contrôleurs et les vues, je ne vois aucun avantage évident à les séparer pour la plupart des projets de base, bien que vous puissiez avoir un besoin particulier de le faire dans une application particulière.
Si vous choisissez de le faire, vous devrez indiquer au framework comment trouver vos contrôleurs. Le moyen de base pour ce faire est de fournir votre propre ControllerFactory. Vous pouvez consulter le code source de DefaultControllerFactory pour avoir une idée de la façon dont cela est fait. Sous-typer cette classe et remplacer la méthode GetControllerType (string controllerName) peut suffire à accomplir ce que vous demandez.
Une fois que vous avez créé votre propre ControllerFactory personnalisé, vous ajoutez la ligne suivante à Application_Start dans global.asax pour indiquer au framework où le trouver:
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
Mise à jour: lisez cet article et les articles auxquels il renvoie pour plus d'informations. Voir aussi le commentaire de Phil Haack sur ce post sur:
ControllerBuilder.Current.DefaultNamespaces.Add(
"ExternalAssembly.Controllers");
... ce qui n'est pas une solution complète, mais peut-être suffisante pour des cas simples.
Bien qu'il soit raisonnable de créer votre propre ControllerFactory, j'ai trouvé plus pratique de définir tous mes contrôleurs dans chaque projet, mais de les dériver des contrôleurs de mon projet partagé:
Cela présente l'avantage supplémentaire de disposer d'un emplacement pour placer votre logique de contrôleur qui diffère d'un projet à l'autre. En outre, il est plus facile pour les autres développeurs de trouver rapidement la logique de votre contrôleur car les contrôleurs existent à l'emplacement standard.
Quant à savoir si cela est souhaitable, je pense que oui. J'ai créé une logique de gestion de compte commune que je souhaite partager entre des projets qui ont autrement une logique métier très différente. Je partage donc mon compte et mes contrôleurs d'administration, mais les autres contrôleurs sont spécifiques à leurs projets respectifs.
la source
Dans la classe, ajoutez le code suivant (For u'r Controller Code)
}
Dans le dossier d'affichage de projet mvc, ajoutez le dossier pour Contact et créez un fichier Call.cshtml.
Ajoutez la référence de projet de bibliothèque de classes dans votre projet MVC principal.
la source
Mon problème a été résolu après la mise à jour
System.Web.Mvc
référence NuGet afin que MvcWebsite et la bibliothèque de classes utilisent la mêmeSystem.Web.Mvc
versionPas besoin d'ajouter des espaces de noms par défaut
la source
La forme la plus simple de séparation que j'utilise est de conserver les vues "telles quelles" dans le projet MVC d'origine mais de supprimer les contrôleurs. Ensuite, dans un nouveau projet ClassLibrary, ajoutez les classes Controller et assurez-vous qu'elles héritent de Controller.
Le moteur de routage MVC acheminera automatiquement vers les contrôleurs de la ClassLibrary et les contrôleurs construiront automatiquement les vues à partir du projet MVC d'origine, à condition que vous ayez correctement mis en place vos références et vos utilisations.
J'utilise cette architecture pour implémenter un module Rapports Html qui peut être compilé et déployé séparément de la solution principale. Enfin, je suis libre de SSRS!
la source