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

时间:2008-12-30 20:19:35

标签: asp.net-mvc

我只是在学习asp.net mvc而我正在试图弄清楚如何将我的控制器转移到一个单独的项目中。通常当我之前设计过asp.net网络应用程序时,我为我的模型创建了一个项目,为我的逻辑创建了另一个项目,然后是网络。

现在我正在学习asp.net mvc我希望遵循类似的模式并将模型和控制器分别放入他们自己的独立项目中,并将views / scripts / css保留在Web中。模型部分很简单,但我不明白的是如何让我的控制器在一个单独的项目中“找到”。另外,我想知道这是否可取。谢谢!

5 个答案:

答案 0 :(得分:87)

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

关于控制器和视图,我认为在大多数基本项目中将它们分开没有任何明显的优势,尽管您可能特别需要在特定应用程序中这样做。

如果您选择这样做,那么您需要告诉框架如何找到您的控制器。执行此操作的基本方法是提供自己的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");

......这不是一个完整的解决方案,但对于简单的案例可能已经足够了。

答案 1 :(得分:17)

虽然创建自己的ControllerFactory是合理的,但我发现在每个项目中定义所有控制器更方便,但是从我的共享项目中的控制器派生它们:

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

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

关于这是否可行,我认为绝对是。我已经创建了一些常见的帐户管理逻辑,我希望在项目之间共享,否则这些项目具有非常不同的业务逻辑。所以我正在共享我的帐户和管理员控制器,但其他控制器特定于他们各自的项目。

答案 2 :(得分:1)

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

MVC路由引擎将自动路由到ClassLibrary中的控制器,并且控制器将自动构建来自原始MVC项目的视图,前提是您已正确使用了引用和使用。

我正在使用这种架构来实现一个Html Reports模块,该模块可以与主解决方案分开编译和部署。最后我没有SSRS!

答案 3 :(得分:1)

我更新了System.Web.Mvc NuGet参考后解决了问题,因此MvcWebsite和类库使用相同的System.Web.Mvc版本

无需添加默认名称空间

答案 4 :(得分:0)

  • 为您的mvc项目添加类库。
  • 在课程中添加以下代码(对于你' r控制器代码)

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

    }

  • 在mvc项目视图文件夹中,添加Contact的文件夹并创建一个Call.cshtml文件。 View Folder

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

Reference

  • 最后将联系人控制器名称空间引用到Route Config。

RouteConfig