簡體   English   中英

一個控制器,用於不同的區域視圖

[英]One controller for different area views

我有2個區域的MVC5應用程序:area1和area2。 這些區域中的某些視圖正在使用來自控制器的代碼,這些代碼實際上與區域1中的視圖和區域2中的視圖相同。 現在,每個區域有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框架中可以滿足其目的。 但是,您可以將控制器中的許多代碼導出到服務類,並且每個控制器都根據需要使用服務-現在,您可以避免代碼重復,並具有更簡單的可維護性

控制器

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM