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();
    }
}