En primer lugar, ciertamente es una buena idea poner su modelo en un proyecto separado. Como ha descubierto, esto es trivial.
Con respecto a los controladores y las vistas, no veo ninguna ventaja obvia en separarlos para la mayoría de los proyectos básicos, aunque es posible que tenga una necesidad particular de hacerlo en una aplicación en particular.
Si elige hacer esto, deberá indicarle al marco cómo encontrar sus controladores. La forma básica de hacer esto es proporcionando su propio ControllerFactory. Puede echar un vistazo al código fuente de DefaultControllerFactory para tener una idea de cómo se hace esto. Subescribir esta clase y anular el método GetControllerType (string controllerName) puede ser suficiente para lograr lo que está pidiendo.
Una vez que haya creado su propio ControllerFactory personalizado, agregue la siguiente línea a Application_Start en global.asax para indicarle al marco dónde encontrarlo:
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
Actualización: lea esta publicación y las publicaciones a las que se vincula para obtener más información. Vea también el comentario de Phil Haack en esa publicación sobre:
ControllerBuilder.Current.DefaultNamespaces.Add(
"ExternalAssembly.Controllers");
... que no es una solución completa, pero posiblemente lo suficientemente buena para casos simples.
Si bien es razonable crear su propia ControllerFactory, me pareció más conveniente definir todos mis Controllers en cada proyecto, pero derivarlos de Controllers en mi proyecto compartido:
Esto tiene el beneficio adicional de que tiene un lugar para colocar su lógica de controlador que difiere de un proyecto a otro. Además, es más fácil para otros desarrolladores encontrar rápidamente la lógica de su controlador porque los controladores existen en el lugar estándar.
En cuanto a si esto es aconsejable, creo que absolutamente lo es. Creé una lógica común de administración de cuentas que quiero compartir entre proyectos que de otra manera tienen una lógica comercial muy diferente. Así que estoy compartiendo mi cuenta y mis controladores administrativos, pero los otros controladores son específicos de sus respectivos proyectos.
fuente
En la clase agregue el siguiente código (para u'r Controller Code)
}
En la carpeta de vista del proyecto mvc, agregue la carpeta para Contacto y cree un archivo Call.cshtml.
Agregue la referencia del proyecto de la biblioteca de clases a su proyecto MVC principal.
fuente
Mi problema se resolvió después de actualizar la
System.Web.Mvc
referencia de NuGet, por lo que MvcWebsite y Class Library usan la mismaSystem.Web.Mvc
versiónNo es necesario agregar espacios de nombres predeterminados
fuente
La forma más simple de separación que utilizo es retener las Vistas "tal cual" en el proyecto MVC original pero eliminar los Controladores. Luego, en un nuevo proyecto de ClassLibrary, agregue las clases Controller y asegúrese de que hereden de Controller.
El motor de enrutamiento MVC se enrutará automáticamente a los controladores en ClassLibrary y los controladores construirán automáticamente las vistas del proyecto MVC original, siempre que tenga sus referencias y usos correctamente en su lugar.
Estoy usando esta arquitectura para implementar un módulo de Informes Html que se puede compilar e implementar por separado de la solución principal. ¡Por fin estoy libre de SSRS!
fuente