當一個網站功能愈來愈多,漸漸變成大型網站,Controllers 資料夾肯定會有愈來愈多的 controllers 檔案。這時就會利用資料夾將 controllers 依功能的不同去做分類,而這時對應的網址以及 View 的資料夾對應勢必也得做改變,本篇文章將會講解 Area 的用法。

首先簡單示範 Area 的預設行為,先新增下列 controller 程式碼:

[Area("Products")]
public class TestController : Controller
{
    public IActionResult Index()
    {
        return Content("Test Index");
    }

    public IActionResult Index2()
    {
        return View();
    }
}

這裡 Area 設定為 Products,所以打開網址 https://localhost/Products/Test 後就可以拿到 response。

如果是範例中的 action index2,就要取得 view 檔案,而它的預設路徑老實說相當奇怪,會在根目錄 Areas/Products/Views/Test/Index2.cshtml。但這個行為是可以設定的,方法如下,在 Startup.cs 加入下列程式碼:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    services.Configure<Microsoft.AspNetCore.Mvc.Razor.RazorViewEngineOptions>(options =>
    {
        //註解為官方所提供的範例
        //options.AreaViewLocationFormats.Clear();
        //options.AreaViewLocationFormats.Add("/MyAreas/{2}/Views/{1}/{0}.cshtml");
        //options.AreaViewLocationFormats.Add("/MyAreas/{2}/Views/Shared/{0}.cshtml");
        //options.AreaViewLocationFormats.Add("/Views/Shared/{0}.cshtml");
        options.AreaViewLocationFormats.Add("/Views/Areas/{2}/{1}/{0}.cshtml");
    });

    services.AddMvc();
}

這樣就能將所有的 View 檔案集中在 Views 資料夾裡做管理。

參考資料