[C#] .Net Core Mvc 的 Action 找不到及Naming Rule of Async

 如題,.Net Core 遇到Action 找不到的問題,發現是 Async 的命名規則有調整。

可以查看看 MvcOptions.SuppressAsyncSuffixInActionNames Property 有說到,會自動將 Async 關鍵字忽略,提供一下處理方式。


1. 使用Url時移除Async字眼

@Html.ActionLink("送出", "SaveData", "User", new { UserId = item.UserId, UserName = item.UserName })

2. Controller 加上 [Route("[controller]/{Action}Async")]

[HttpPost]
[Route("[controller]/SaveDataAsync")]
public async Task SaveDataAsync(string UserId, string UserName)
{
    //	TODO...
    return RedirectToAction("Index");
}

3. 調整設定,不忽略"Async"

// .NET 6 / .NET 7版本
public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews(options =>
    {
        // 當設為 true 時,MVC 會自動忽略控制器動作方法名稱中的 "Async" 字樣
        options.SuppressAsyncSuffixInActionNames = false;
    });
}

//	舊的 services.AddMvc() 寫法
services.AddMvc(options =>
{
    options.SuppressAsyncSuffixInActionNames = false;
});

4. 統一將 Async 改為 Asynch

[HttpPost]
public async Task SaveDataAsynch(string UserId, string UserName)
{
    //	TODO...
    return RedirectToAction("Index");
}

//	頁面端
@Html.ActionLink("送出", "SaveDataAsynch", "User", new { UserId = item.UserId, UserName = item.UserName })

●使用情境:

1. 若是堅持使用 Async ,且舊翻新或是專案已經開發一大段的,那使用設定檔也是可以,全看各自專案的現況。

2. 若是新專案,那每個Controller加上 Route 或是 移除Async字眼也是可以,全看各自專案的 coding rule 跟 狀況。

3. 個人認為第4種方式也可以,所謂山不轉路轉,既不會跟 .net core 新規則衝突,也可以做到一樣的效果。

留言

這個網誌中的熱門文章

[C#] 無法載入檔案或組件 或其相依性的其中之一。 找到的組件資訊清單定義與組件參考不符。 (發生例外狀況於 HRESULT: 0x80131040)

[Cloud CICD] 後端篇 - .Net8 WebApi, Github Action, Azure App Service

[Cloud CICD] 前端篇 - Vue3, Github Action, Azure Static Web App