ASP.NET Core MVC - アクション名のAsyncサフィックスが削除されることを確認する
ASP.NET Core の破壊的変更 - .NET Core | Microsoft Docs
上記ドキュメントにある「コントローラアクション名からAsync サフィックスが削除される」ことを確認してみました。
MVC: コントローラー アクション名から Async サフィックスを削除 aspnet/AspNetCore#4849 への対処の一環として、ASP.NET Core MVC では、アクション名から Async サフィックスが既定で削除されます。 ASP.NET Core 3.0 以降、この変更はルーティングとリンク生成の両方に影響します。
ルーティング
次のコントローラのSampleAsyncアクションメソッドは~/default/sample
のURLで呼び出せますが、~/default/sampleasync
では呼び出せません。
public class DefaultController : Controller { public async Task<IActionResult> SampleAsync() { await Task.Delay(0); return View(); } }
URLの生成
タグヘルパーやHTMLヘルパー、URLヘルパーでURLを生成するときは、アクション名からAsyncを取り除く必要があります。
うっかりAsyncを付けてしまいそう。
<a asp-action="Sample" asp-controller="Default">@Url.Action("Sample", "Default")</a> <!-- 生成されるHTML --> <a href="/default/sample">/default/sample</a>
ビュー名
ビュー名を省略した場合のViewResultは、Asyncを取り除いたアクション名のファイルを検索します。例えばSampleAsyncアクションではSample.cshtmlを検索します。
もちろんPartialViewResultも同じ動きでした。
public class DefaultController : Controller { public async Task<IActionResult> SampleAsync() { await Task.Delay(0); return View(); } // 検索するcshtmlのパス // /Views/Default/Sample.cshtml // /Views/Shared/Sample.cshtml public async Task<IActionResult> SamplePartialAsync() { await Task.Delay(0); return PartialView(); } // 検索するcshtmlのパス // /Views/Default/SamplePartial.cshtml // /Views/Shared/SamplePartial.cshtml }
おまけ
AsyncアクションメソッドとAsyncを省略した同名のアクションメソッドを同じコントローラに定義できますが、実行してURLにアクセスするとAmbiguousMatchExceptionがスローされます。
注意しましょう。作らないかな。
public class DefaultController : Controller { // AmbiguousMatchExceptionがスローされる public IActionResult Sample() { return View(); } public async Task<IActionResult> SampleAsync() { await Task.Delay(0); return View(); } }