为MVC 4应用程序设计控制器的正确方法

时间:2013-10-24 17:54:27

标签: asp.net-mvc controller

我有一个带有menu和menuItem的简单模型,它们都继承自抽象类。

我创建了一个可以进行CRUD操作的adminController。

我在这里遇到的是应该为menu和menuItem创建控制器吗? 因为menu和menuItem都是从同一类型继承的。 同时,他们对像Edit()这样的方法的相同观点可以有不同的外观。 我的意思是我必须检查视图以了解我正在尝试编辑菜单或MenuItem

但如果我为每个实体实现控制器,我有重复的代码。 那么为这种操作设计控制器的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

对于它的价值,控制器只是类,这意味着它们可以继承自己。所以,您可以这样做:

public class MenuController : Controller
{
    // all the actions here
}

public class MenuItemController : MenuController
{
}

根据命名约定,您可以将不同的视图应用于每个控制器的操作,只需将它们放在各自的视图目录中:“Menu”和“MenuItem”。

如果您需要更改子类控制器中的特定操作方法,只需在MenuController中虚拟操作,然后在MenuItemController中覆盖它:

public class MenuController : Controller
{
    public virtual ActionResult SomeActionToOverride() { ... }
}

public class MenuItemController : MenuController
{
    public override ActionResult SomeActionToOverride() { ... }
}

这只是基本的OOP。

答案 1 :(得分:0)

不幸的是,答案是“它取决于”。

您可以根据对象类型从同一菜单控制器调度到不同的视图,使用控制器上的常见操作,视图调用具有类型区分属性的相同HttpPost操作。这是一种将OO架构暴露给公共API表面的设计。

或者,由于这些是独立的域实体,您可以使用自己的CRUD操作套件公开两个控制器,并且具有更多类似于API的REST表面。

重复代码以提供独立的端点或安全策略区分对公共API表面的影响比其他地方更少气味。