vistas vista una que para net mvc mostrar modelos modelo datos asp asp.net-mvc

asp.net-mvc - vista - razor para mvc



asp.net mvc coloca los controladores en un proyecto separado (4)

Estoy aprendiendo asp.net mvc y estoy intentando descubrir cómo mover mis controladores a un proyecto separado. Normalmente, cuando había diseñado aplicaciones web asp.net antes, creaba un proyecto para mis modelos, otro para mi lógica y luego estaba la web.

Ahora que estoy aprendiendo asp.net mvc, esperaba seguir un patrón similar y poner los modelos y controladores cada uno en sus propios proyectos, y simplemente dejar las vistas / scripts / css en la web. La parte de los modelos fue fácil, pero lo que no entiendo es cómo hacer que mis controladores en un proyecto separado sean "encontrados". Además, me gustaría saber si esto es aconsejable. ¡Gracias!


Antes que nada, es una buena idea poner tu modelo en un proyecto separado. Como has descubierto, esto es trivial.

En cuanto a Controladores y Vistas, no veo ninguna ventaja obvia para 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 eliges hacer esto, entonces necesitarás decirle al framework cómo encontrar tus controladores. La forma básica de hacerlo es suministrando su propia ControllerFactory. Puede echar un vistazo al código fuente de DefaultControllerFactory para tener una idea de cómo se hace esto. Subtitular 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 propia ControllerFactory personalizada, agregue la siguiente línea a Application_Start en global.asax para indicarle al framework dónde encontrarla:

ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());

Actualización: lee esta publicación y las publicaciones a las que enlaza para obtener más información. Ver 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.


La forma más simple de separación que uso es retener las Vistas "como están" en el proyecto original de MVC pero eliminar los Controladores. Luego, en un nuevo proyecto de ClassLibrary, agregue las clases de Controller y asegúrese de que hereden de Controller.

El motor de enrutamiento MVC automáticamente enrutará a los Controladores en ClassLibrary y los Controladores construirán automáticamente las Vistas desde el 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!


Si bien es razonable crear su propia ControllerFactory, me pareció más conveniente definir todos mis controladores en cada proyecto, pero derivarlos de los controladores en mi proyecto compartido:

namespace MyProject1.Controllers { public class MyController : MySharedProject.Controllers.MyController { // nothing much to do here... } } namespace MySharedProject.Controllers { public abstract class MyController : System.Web.Mvc.Controller { // all (or most) of my controller logic here... } }

Esto tiene el beneficio adicional de que tiene un lugar donde ubicar la lógica de su Controlador que difiere de un proyecto a otro. Además, es más fácil para otros desarrolladores encontrar rápidamente la lógica del Controlador porque los Controladores existen en el lugar estándar.

En cuanto a si esto es aconsejable, creo que definitivamente lo es. He creado una lógica de administración de cuentas común que quiero compartir entre proyectos que de otra manera tienen una lógica comercial muy diferente. Así que estoy compartiendo mi cuenta y los controladores de administración, pero los otros controladores son específicos de sus respectivos proyectos.


  • Agregue la Biblioteca de clases para su proyecto mvc.
  • En la clase, agregue el siguiente código (para su código de controlador)

    namespace ContactController { public class ContactController : Controller { public ActionResult Call() { ViewBag.Title = "Inside MyFirst Controller."; return View(); } }

    }

  • En la carpeta de vista de proyecto de mvc, agregue la carpeta de Contacto y cree un archivo Call.cshtml.

  • Agregue la referencia del proyecto de biblioteca de clase en su proyecto MVC principal.

  • Finalmente para referir el espacio de nombres del controlador de contacto a Route Config.