代码之家  ›  专栏  ›  技术社区  ›  Aaron Palmer

asp.net mvc将控制器放入一个单独的项目中

  •  97
  • Aaron Palmer  · 技术社区  · 17 年前

    我只是在学习asp.NETMVC,我正试图找出如何将我的控制器移动到一个单独的项目中。通常,当我以前设计过asp.net web应用程序时,我会为我的模型创建一个项目,为我的逻辑创建另一个项目,然后就是web。

    现在我正在学习asp.NETMVC,我希望遵循类似的模式,将模型和控制器分别放在各自独立的项目中,并将视图/脚本/css留在web中。模型部分很简单,但我不明白的是如何在一个单独的项目中“找到”我的控制器。另外,我想知道这是否明智。谢谢

    5 回复  |  直到 17 年前
        1
  •  91
  •   Craig Stuntz    17 年前

    首先,将您的模型放到一个单独的项目中当然是个好主意。正如你所发现的,这是微不足道的。

    关于控制器和视图,我看不出在大多数基本项目中分离它们有什么明显的优势,尽管在特定的应用程序中可能需要这样做。

    如果您选择这样做,那么您需要告诉框架如何找到控制器。实现这一点的基本方法是提供您自己的ControllerFactory。您可以查看DefaultControllerFactory的源代码,了解如何实现这一点。子类型化这个类并重写GetControllerType(string controllerName)方法可能足以完成您的要求。

    创建了自己的自定义ControllerFactory后,将以下行添加到global.asax中的Application_Start,以告知框架在何处可以找到它:

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

    更新: 阅读 this post 有关更多信息,请访问它链接到的帖子。另请参见Phil Haack对该帖子的评论:

    ControllerBuilder.Current.DefaultNamespaces.Add(
        "ExternalAssembly.Controllers");
    

        2
  •  19
  •   ThisGuy    13 年前

    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...
       }
    }
    

    这还有一个额外的好处,即您可以放置不同项目的控制器逻辑。另外,其他开发人员更容易快速找到您的控制器逻辑,因为控制器存在于标准位置。

        3
  •  4
  •   Mohan Kumar    11 年前
    • 在类中添加以下代码(用于u'r控制器代码)

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

      }

    • View Folder

    • 将类库项目引用添加到主MVC项目中。

    Reference

    • 最后,将联系人控制器名称空间引用到路由配置中。

    RouteConfig

        4
  •  3
  •   Homayoun Behzadian    8 年前

    System.Web.Mvc NuGet引用,以便MvcWebsite和类库使用相同的 System.Web.Mvc

    无需添加默认名称空间

        5
  •  1
  •   Jamie    12 年前

    我使用的最简单的分离形式是保留原始MVC项目中的视图“原样”,但删除控制器。然后在一个新的类库项目中添加控制器类,并确保它们从控制器继承。

    MVC路由引擎将自动路由到类库中的控制器,并且控制器将自动从原始MVC项目构造视图,前提是您的引用和使用正确。