ASP.NET 5 採用 One ASP.NET 概念,建立專案時可依需求勾選啟用 Web Forms、MVC 及 Web API 功能:

ASP.NET Core 的做法不太一樣,必須由 API、Web Application (Razor Pages)、Web Application (MVC)、Angular、React.js... 等專案範本擇一:

要 ASP.NET Core 專案同時支援 MVC、Razor Pages 當然不是問題,但必須自己改。

這篇文章就來練習如何在 Razor Pages 中專案加入 MVC Controller。

要在 MVC 專案啟用 Razor Pages 或在 Razor Pages 專案使用 MVC Controller 做法不難,在 Startup.cs ConfigureServices(IServiceCollection services) 加入 services.AddRazorPages()、serivces.AddControllers() 等指令即可,不過名稱相似的 Add***() 方法有好幾個,平日靠專案範本自動產生,要自己寫一時之間還真不知該用哪個好。推薦國外 MVP Filip W. 的一篇好文章 - ASP.NET Core MVC 3.x – AddMvc(), AddMvcCore(), AddControllers() and other bootstrapping approaches,對這些擴充方法做了詳細介紹:

services.AddMvcCore()

只註冊運行 Controller/Razor Pages 必要的核心服務,確保 Pipeline 程序可動作,其餘如像 Data Annotation Model Validation、身分驗證等服務要自己加掛,除有特殊客製需求,一般不太常用。

services.AddControllers()

包含 AddMvcCore() 所做的動作外,再加上:

  1. 身分驗證服務
  2. Swagger/Open API 等 API 文件動態產生功能
  3. Data Annotation - 支援 Attribute 資料檢核及 IValidateObject
  4. Formatter Mapping - 依 Request 需求提供不同格式(JSON/XML)內容
  5. CORS - 支援跨網域整合

要用 Controller 但不會用到 View,例如純 WebAPI,可以選這個。

services.AddControllersWithViews()

包含 AddControllers() 的所有項目,再加上:

  1. cshtml Razor View
  2. Cache Tag Helper

要使用標準 Model + View + Controller 架構,通常就選這個。

services.AddRazorPages()

包含 AddMvcCore() 所有功能,再加上:

  1. Razor Pages 功能
  2. 身分驗證服務
  3. Data Annotation - 支援 Attribute 資料檢核及 IValidateObject
  4. Cache Tag Helper

services.AddMvc()

等於 AddControllersWithViews() 加 AddRazorPages(),不想漏掉功能發揮 ASP.NET Core 最大威力,選這個就對了。

修改方法

回到在 Razor Pages 專案啟用 MVC,原本的 Startup.cs 如下:

public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
    }

    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}

只需修改三個地方(見註解處):

public void ConfigureServices(IServiceCollection services)
{
    //改呼叫AddMvc()
    services.AddMvc();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler("/Error");
    }

    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
        //加上MapDefaultControllerRoute()
        endpoints.MapDefaultControllerRoute();
        //支援透過Attribute指定路由
        endpoints.MapControllers();
    });
}

如此即可在 Razor Pages 專案新增 *Controller.cs、.cshtml 寫 MVC 網頁囉~

【補充】在 ASP.NET Core 3 註冊 Controller 路徑有幾個擴充方法可用:

Tips of enabling MVC support in ASP.NET Core Razor Pages project.


Comments

# by Switch_Squirrel

黑大,下方補充Route打成Rount了 另外想請問黑大,若是用Angular/React等專案,是否也可用相同手法來操作?

# by Jeffrey

to Switch_Squirrel,這部分我就沒研究了。Angular/React 不在我的 Roadmap 裡,我目前以 cshtml 搭配純 JS 用 Vue 寫 MVVM 為主,已很久沒寫 SPA。

# by Lauyea

感謝黑大,想在Razor pages專案中使用web api一直撞牆,找好久才找到黑大這篇文章,太感謝了XD

Post a comment