[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 新規則衝突,也可以做到一樣的效果。
留言
張貼留言