Razor Pagesで省略可能なURLパラメーターを定義するコードを紹介します。
概要
こちらの記事では、ASP.NET Core のRazor PageでURLパラメーターを取得する方法を紹介しました。
@page ディレクティブで拡張URL形式でパラメーターを取得する場合、パラメーターが無い場合はページへのルーティングもされない動作になります。
アプリケーションの内容によってはパラメーターを省略した場合でもページを表示したい場合があります。
この記事では、Razor Pageで省略可能なURLパラメーターを定義するコードを紹介します。
書式
省略可能なパラメーターにする場合は、パラメーター名の末尾に "?" を記述します。
記述例
@page "/page/{parameter1?}"
@page "/search/{query}/{num?}"
プログラム
コード
Razor Pageを2ページ作成します。
@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>
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;
}
}
}
@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>
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のルーティング処理を追記します。
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