我有MVC5应用程序,它有2个区域:area1和area2。 这些区域中的一些视图使用来自控制器的代码,对于area1中的视图和区域2中的视图实际上是相同的。 现在我每个区域有2个控制器,但正如我所提到的,代码非常相似。 如何在区域1和2中为每个视图使用一个控制器,以避免代码重复并具有更简单的可维护性?
答案 0 :(得分:2)
区域只是一个层,但它们仍然可以相互交互,也可以与整个应用程序交互。如果您需要共享一个控制器,您可以简单地将其子类化。更好的是,在区域之外创建一个抽象控制器,并从中继承每个区域的控制器。
就观点而言,Razor有一个非常简单的约定来处理覆盖和后备。它根据约定搜索多个目录,用于所需的视图,并仅在找到匹配时停止。
例如,如果您将视图放在Views\Shared
中,这是最后的手段后备,则可以在应用程序的任何位置使用它,包括您的每个区域。视图位置的操作顺序为:
Areas\[AreaName]\Views\[ControllerName]
Areas\[AreaName]\Views\Shared
Views\[ControllerName]
Views\Shared
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;
}
}