一个用于不同区域视图的控制器

时间:2015-07-29 16:50:58

标签: c# asp.net-mvc-5

我有MVC5应用程序,它有2个区域:area1和area2。 这些区域中的一些视图使用来自控制器的代码,对于area1中的视图和区域2中的视图实际上是相同的。 现在我每个区域有2个控制器,但正如我所提到的,代码非常相似。 如何在区域1和2中为每个视图使用一个控制器,以避免代码重复并具有更简单的可维护性?

2 个答案:

答案 0 :(得分:2)

区域只是一个层,但它们仍然可以相互交互,也可以与整个应用程序交互。如果您需要共享一个控制器,您可以简单地将其子类化。更好的是,在区域之外创建一个抽象控制器,并从中继承每个区域的控制器。

就观点而言,Razor有一个非常简单的约定来处理覆盖和后备。它根据约定搜索多个目录,用于所需的视图,并仅在找到匹配时停止。

例如,如果您将视图放在Views\Shared中,这是最后的手段后备,则可以在应用程序的任何位置使用它,包括您的每个区域。视图位置的操作顺序为:

  1. Areas\[AreaName]\Views\[ControllerName]
  2. Areas\[AreaName]\Views\Shared
  3. Views\[ControllerName]
  4. Views\Shared
  5. Razor会在列表中查找每个位置的视图,直到找到它为止。

答案 1 :(得分:1)

您可以保留单独的控制器,因为它们可以在MVC框架中实现其目的。但是,您可以将控制器中的大部分代码导出到服务类,并且每个控制器都会根据需要使用这些服务 - 现在您避免代码重复性并且具有更简单的可维护性。 / p>

<强>控制器

public class HomeController : Controller
{
    private IFooService service;

    public HomeController()
    {
        this.service = new FooService(dbContext);
    }

    public ActionResult CalculateFoo(int id)
    {
        var foo = this.service.CalculateFoo(id);
        return View(foo);
    }
}

public class FooController : Controller
{
    private IFooService service;

    public FooController()
    {
        this.service = new FooService(dbContext);
    }

    public ActionResult Details(int id)
    {
        var foo = this.service.CalculateFoo(id);
        return View(foo);
    }
}

<强>服务

public class FooService : IFooService
{
    private DbContext db;

    public FooService(DbContext db)
    {
        this.db = db;
    }

    public Foo CalculateFoo(int id)
    {
        var foo = this.db.Foo.First(f => f.id == id);
        // do stuff
        return foo;
    }
}