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

本文关键字:区域 视图 用于 控制器 一个 | 更新日期: 2023-09-27 18:05:37

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

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

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

就视图而言,Razor在处理重写和回退方面有一个非常简单的约定。它根据约定在多个目录中搜索所需的视图,并仅在找到匹配时停止。

例如,如果您将视图放置在Views'Shared(最后的回退)中,它可以在应用程序中的任何地方使用,包括您的每个区域。查看位置的操作顺序为:

  1. Areas'[AreaName]'Views'[ControllerName]
  2. Areas'[AreaName]'Views'Shared
  3. Views'[ControllerName]
  4. Views'Shared

Razor将沿着列表查找每个位置的视图,直到找到为止。

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

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