我正在学习asp.net mvc,试图找出如何将我的控制器移动到一个单独的项目中。通常情况下,在我以前设计asp.net web应用程序时,我会为我的模型创建一个项目,为逻辑创建另一个项目,然后是web。
现在,我希望遵循类似的模式,将模型和控制器分别放入自己的独立项目中,只将视图/脚本/css留在web中。模型部分很容易实现,但是我不明白如何使位于不同项目中的控制器被“找到”。而且,我想知道这是否可取。谢谢!
我正在学习asp.net mvc,试图找出如何将我的控制器移动到一个单独的项目中。通常情况下,在我以前设计asp.net web应用程序时,我会为我的模型创建一个项目,为逻辑创建另一个项目,然后是web。
现在,我希望遵循类似的模式,将模型和控制器分别放入自己的独立项目中,只将视图/脚本/css留在web中。模型部分很容易实现,但是我不明白如何使位于不同项目中的控制器被“找到”。而且,我想知道这是否可取。谢谢!
首先,将你的模型放置在一个单独的项目中确实是一个好主意。正如你已经发现的那样,这很简单。
关于控制器和视图,对于大多数基础项目来说,我并没有看到将它们分开的明显优势,尽管在特定应用程序中可能有特别需要这样做的情况。
如果你选择这样做,则需要告诉框架如何找到你的控制器。最基本的方法是提供自己的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并从我的共享项目中派生它们更方便:
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 逻辑,因为 Controllers 存在于标准位置。
至于是否建议这样做,我认为绝对是可以的。我已经创建了一些通用的帐户管理逻辑,希望在在业务逻辑非常不同的项目之间共享它们。因此,我分享了我的 Account 和 Admin Controllers,但其他 Controllers 则特定于其各自的项目。
In the class add the following code(For u'r Controller Code)
namespace ContactController
{
public class ContactController : Controller
{
public ActionResult Call()
{
ViewBag.Title = "Inside MyFirst Controller.";
return View();
}
}
}
On the mvc project view folder add the folder for Contact and create a Call.cshtml file.
Add the class library project reference into your main MVC project.
在我更新System.Web.Mvc
NuGet引用以后,我的问题得到了解决,因此MvcWebsite和Class Library使用相同的System.Web.Mvc
版本
无需添加默认命名空间