我只是在学习asp.net mvc,并且试图弄清楚如何将控制器移动到单独的项目中。通常,当我之前设计过asp.net Web应用程序时,我为模型创建了一个项目,为逻辑创建了另一个项目,然后有了Web。
现在,我正在学习asp.net mvc,我希望遵循类似的模式,将模型和控制器分别放入各自的独立项目中,并将视图/脚本/ css留在网络中。模型部分很简单,但是我不了解的是如何“找到”我在单独项目中的控制器。另外,我想知道这是否明智。谢谢!
我只是在学习asp.net mvc,并且试图弄清楚如何将控制器移动到单独的项目中。通常,当我之前设计过asp.net Web应用程序时,我为模型创建了一个项目,为逻辑创建了另一个项目,然后有了Web。
现在,我正在学习asp.net mvc,我希望遵循类似的模式,将模型和控制器分别放入各自的独立项目中,并将视图/脚本/ css留在网络中。模型部分很简单,但是我不了解的是如何“找到”我在单独项目中的控制器。另外,我想知道这是否明智。谢谢!
Answers:
首先,将模型放入一个单独的项目中肯定是一个好主意。正如您所发现的,这是微不足道的。
关于控制器和视图,对于大多数基本项目,我看不出将它们分开有任何明显的优势,尽管您可能需要在特定的应用程序中这样做。
如果确实选择执行此操作,则将需要告诉框架如何查找控制器。实现此目的的基本方法是提供自己的ControllerFactory。您可以查看DefaultControllerFactory的源代码,以了解实现方式。对此类进行子类化并重写GetControllerType(string controllerName)方法可能足以完成您所要的内容。
创建自己的自定义ControllerFactory后,将以下行添加到global.asax的Application_Start中,以告诉框架在哪里找到它:
ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());
更新:阅读此文章 及其链接到的文章以了解更多信息。另请参阅Phil Haack关于该帖子的评论:
ControllerBuilder.Current.DefaultNamespaces.Add(
"ExternalAssembly.Controllers");
...这不是一个完整的解决方案,但对于简单的情况可能已经足够了。
尽管创建自己的ControllerFactory是合理的,但我发现在每个项目中定义所有Controller更为方便,但可以从Shared项目中的Controller派生它们:
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逻辑,因为Controllers存在于标准位置。
关于这是否可取,我认为绝对是。我创建了一些常见的帐户管理逻辑,希望在项目之间共享这些逻辑,否则这些项目将具有非常不同的业务逻辑。因此,我共享我的“帐户”和“管理员”控制器,但其他控制器专用于它们各自的项目。
在该类中添加以下代码(针对您的控制器代码)
namespace ContactController
{
public class ContactController : Controller
{
public ActionResult Call()
{
ViewBag.Title = "Inside MyFirst Controller.";
return View();
}
}
}
在mvc项目视图文件夹上,添加Contact文件夹并创建一个Call.cshtml文件。
将类库项目引用添加到您的主MVC项目中。
更新System.Web.Mvc
NuGet参考后解决了我的问题,因此MvcWebsite和类库使用相同的System.Web.Mvc
版本
无需添加默认名称空间