2023/02/20

[.NET] 升級 ASP.NET MVC 至 ASP.NET Core MVC 的注意事項

前言

繼上篇 如何使用 .NET Upgrade Assistant 升級舊 ASP.NET MVC 專案 所遇到的升級問題再做一個小小的注意事項筆記

網站檔案路徑

在 ASP.NET MVC 可以透過 Server.MapPath() 來指定在伺服器上的路徑

例如:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        string docsPath = Server.MapPath("~/docs");

        //...
    }
}

而在 ASP.NET Core MVC 需要經由注入 Microsoft.AspNetCore.Hosting.IWebHostEnvironment 來讀取環境變數

例如:

public class MyService
{
    public MyService(IWebHostEnvironment env)
    {
        string docsPath = $@"{env.CotnentRootPath}/docs";
    }
}

網站靜態檔案路徑

在 ASP.NET MVC 的靜態檔案路徑基本上就是專案內的資料夾都可以,通用會以 Content 為放置靜態檔案

升級到 ASP.NET Core MVC 之後,wwwroot 目錄則為公開的根目錄,靜態資源檔案就需要放置在此處,而在 View 上有關的檔案路徑也要一併修正

註冊依賴注入 (Dependency Injection)

如上面的 MyService 使用了 IHostEnvironment,如果在 Controller 勢必不能用 new 的方法來建立 MyService 而是要依賴注入

開啟 Program.cs 裡有一區 // Add services to the container 即是要把相關的 Services 註冊進來,否則會得到如: InvalidOperationException: Unable to resolve service for type XXX while attempting to activate XXX

而依賴注入在 ASP.NET Core MVC 有三種方式: AddSingleton, AddScoped, AddTransient

詳細使用方式請查看官方文件 .NET Core 中的相依性插入

以此範例而言,每次要求就建立新的注入元件:

builder.Services.AddTransient<myservice>();

其他注意事項

檢視 View 的部分,ASP.NET Core MVC 與 ASP.NET MVC 最大的差異是多了 Razor Page 及 Tag Helper。

據之前用 ASP.NET Core MVC (3.0) 版本開發專案時,使用 Tag Helper 的方式,至少可以減少前端切版提供檔案後,改寫標籤的幅度。

原先 View 的 .cshtml 在升級後大多能直接支援,但是若有用到例如:HttpContext, Modernizr 的 @Styles.Render, @Scripts.Render 都要修改掉。

更多 View 的相關資料:

相關連結