Razor Pagesで省略可能なURLパラメーターを定義する - ASP.NET Core

Razor Pagesで省略可能なURLパラメーターを定義するコードを紹介します。

概要

こちらの記事では、ASP.NET Core のRazor PageでURLパラメーターを取得する方法を紹介しました。
@page ディレクティブで拡張URL形式でパラメーターを取得する場合、パラメーターが無い場合はページへのルーティングもされない動作になります。 アプリケーションの内容によってはパラメーターを省略した場合でもページを表示したい場合があります。
この記事では、Razor Pageで省略可能なURLパラメーターを定義するコードを紹介します。

書式

省略可能なパラメーターにする場合は、パラメーター名の末尾に "?" を記述します。
{(パラメーター名)?}

記述例

@page "/page/{parameter1?}"
@page "/search/{query}/{num?}"

プログラム

コード

Razor Pageを2ページ作成します。
OptionalParameter.cshtml
@page "{param1?}/{param2?}"
@model GetUrlParameter.Pages.OptionalParameterModel
@{
}
<html>
<head></head>
<body>
  <div>URLパラメーターのテスト (OptionalParameter)</div>
  <div>Param1 : @Model.Param1Str</div>
  <div>Param2 : @Model.Param2Str</div>
</body>
</html>
OptionalParameter.cshtml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace GetUrlParameter.Pages
{
  public class OptionalParameterModel : PageModel
  {
    public string Param1Str { get; set; }
    public string Param2Str { get; set; }

    public void OnGet(string param1, string param2)
    {
      Param1Str = param1;
      Param2Str = param2;

    }
  }
}
FixParameter.cshtml
@page "{param1}/{param2}"
@model GetUrlParameter.Pages.FixParameterModel
@{
}
<html>
<head>
</head>
<body>
  <div>URLパラメーターのテスト (FixParameter)</div>
  <div>Param1 : @Model.Param1Str</div>
  <div>Param2 : @Model.Param2Str</div>
</body>
</html>
FixParameter.cshtml.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace GetUrlParameter.Pages
{
  public class FixParameterModel : PageModel
  {
    public string Param1Str { get; set; }
    public string Param2Str { get; set; }

    public void OnGet(string param1, string param2)
    {
      Param1Str = param1;
      Param2Str = param2;
    }
  }
}

Startup.cs ファイルを変更します。Razor Pagesのルーティング処理を追記します。
Startup.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace GetUrlParameter
{
  public class Startup
  {
    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
      services.AddRazorPages();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
      if (env.IsDevelopment()) {
        app.UseDeveloperExceptionPage();
      }
      app.UseRouting();
      app.UseEndpoints(endpoints =>
      {
        endpoints.MapRazorPages();
      });
    }
  }
}

解説

OptionalParameter.cshtml では @page ディレクティブの値は @page "{param1?}/{param2?}" となっており、パラメーター名の後ろに"?"が記述されており、パラメーターを省略できます。
一方、FixParameter.cshtml では @page ディレクティブの値は @page "{param1}/{param2}" となっており、パラメーターは省略できない設定となります。

実行結果

プロジェクトを実行します。初めに (アプリケーションルートURL)/FixParameter のURLにアクセスします。 ページが見つからない旨のエラーが表示されます。(404エラー)


続いて (アプリケーションルートURL)/FixParameter/Penguin のURLにアクセスします。 こちらもページが見つからに旨のエラーが表示されます。


(アプリケーションルートURL)/FixParameter/Penguin/Duck のURLにアクセスします。 下図のページが表示されます。URLに設定した値が、ページの Param1, Param2 値に反映されています。
@page ディレクティブの値を @page "{param1}/{param2}" としているため、2つのパラメーターの値が両方ともURLに含まれている場合に Razor Page にルーティングされる動作になっていることがわかります。


続いて、OptionalParameter のRazorPageの挙動を確認します。
`(アプリケーションルートURL)/OptionalParameter` のURLにアクセスします。Razorページが表示されます。しかし、ページ内のパラメーターには何も表示されません。~


続いて (アプリケーションルートURL)/OptionalParameter/Penguin のURLにアクセスします。 Razorページが表示され、Param1 の値のみURLに設定したパラメーターの値が反映されています。


(アプリケーションルートURL)/OptionalParameter/Penguin/Duck のURLにアクセスします。 下図のRazorページが表示され、Param1, Param2 にURLに設定したパラメータの値が反映されています。
@page ディレクティブの値を @page "{param1?}/{param2?}" としているため、2つのパラメーターの値があっても、無くても、 Razor Page にルーティングされる動作になっていることがわかります。



なお、(アプリケーションルートURL)/OptionalParameter/Penguin/Duck/Bear のURLにアクセスすると、404エラーとなります。 2つの省略可能なパラメータを持つ設定になっているため、パラメーターが3つの場合は@pageディレクティブの条件にマッチせず、Razor Pageへのルーティングもされない動作になります。


著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2021-05-15
作成日: 2021-05-12
iPentec all rights reserverd.