一个控制器用于不同的区域视图
本文关键字:区域 视图 用于 控制器 一个 | 更新日期: 2023-09-27 18:05:37
我有MVC5应用程序,它有2个区域:area1和area2。这些区域中的一些视图使用来自控制器的代码对于viewinarea1和viewinarea2来说实际上是一样的。现在每个区域有2个控制器,但正如我提到的,代码是非常相同的。如何在区域1和2中为每个视图使用一个Controller以避免代码重复并具有更简单的可维护性?
区域只是一个层,但它们仍然可以相互交互,也可以与整个应用程序交互。如果你需要共享一个控制器,你可以简单地创建它的子类。更好的是,在区域之外创建一个抽象控制器,并从中继承每个区域的控制器。
就视图而言,Razor在处理重写和回退方面有一个非常简单的约定。它根据约定在多个目录中搜索所需的视图,并仅在找到匹配时停止。
例如,如果您将视图放置在Views'Shared
(最后的回退)中,它可以在应用程序中的任何地方使用,包括您的每个区域。查看位置的操作顺序为:
-
Areas'[AreaName]'Views'[ControllerName]
-
Areas'[AreaName]'Views'Shared
-
Views'[ControllerName]
-
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;
}
}