つばろぐ

主に C#, .NET, Azure の備忘録です。たまに日記。

ASP.NET Core Razor Pagesにおける単一ページのルーティング

ASP.NET Core Razor Pagesでのルーティング設定につまづいたので手順を残しておきます。
ASP.NET Core MVCをよく使うため、単純に慣れの問題。

docs.microsoft.com

RazorPagesRouteSample
|--Areas
| |--Identity
| | |--Data
| | | |--RazorPagesRouteSampleIdentityDbContext.cs
| | |--IdentityHostingStartup.cs
| | |--Pages
| | | |--Account
| | | | |--Login.cshtml
| | | | |--Login.cshtml.cs
| | | |--_ValidationScriptsPartial.cshtml
| | | |--_ViewStart.cshtml
|--Pages
| |--_ViewImports.cshtml
| |--_ViewStart.cshtml
| |--Error.cshtml
| |--Error.cshtml.cs
| |--Index.cshtml
| |--Index.cshtml.cs
| |--Privacy.cshtml
| |--Privacy.cshtml.cs
| |--Shared
| | |--_CookieConsentPartial.cshtml
| | |--_Layout.cshtml
| | |--_LoginPartial.cshtml
| | |--_ValidationScriptsPartial.cshtml
| |--YourVoice.cshtml
| |--YourVoice.cshtml.cs
|--Program.cs
|--RazorPagesRouteSample.csproj
|--Startup.cs

上記のディレクトリ構成の場合を例にする。

ページを別名でアクセス可能にするルーティング

例: Pages/Privacy.cshtml へのアクセスを /SitePrivacy で可能にする。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddRazorPagesOptions(options =>
            {
                options.Conventions.AddPageRoute("/Privacy", "SitePrivacy/");
            })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

ページを別名でアクセス可能にするルーティング(パラメーター付き)

例: Pages/YourVoice.cshtml へのアクセスを /Voice/{text?} で可能にする。

Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddRazorPagesOptions(options =>
            {
                options.Conventions.AddPageRoute("/YourVoice", "Voice/{text?}");
            })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

YourVoice.cshtml

@page "{text?}" //受けるパラメーターを定義

YourVoice.cs

public class YourVoiceModel : PageModel
{
    public void OnGet(string text = null) //パラメーターを引数で受ける
    {
    }
}

エリア内のページへのルーティング

例: Identity エリアにあるログインページへのルーティング

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc()
        .AddRazorPagesOptions(options =>
            {
                options.Conventions.AddAreaPageRoute("Identity", "/Account/Login", "Login/");
            })
        .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}

なお options.Conventions.AddPageRoute("/Identity/Account/Login", "Login/"); では正しいルーティング設定とならない。