Razor PagesでURLパラメーターを取得する - ASP.NET Core

Razor PagesでURLパラメーターを取得するコードを紹介します。

概要

Razor PagesでURLパラメーターを取得するには、OnGetメソッドにパラメーター名の引数を追加します。
または、Request.Query オブジェクトから取得する方法もあります。

プログラム例:OnGetメソッドで取得する例 (.NET6)

コード

.NET6でASP.NET Coreアプリケーションを作成します。
下記コードを記述します。
/Pages/UsingGetMethod01.cshtml
@page
@model GetUrlParameter.Pages.UsingGetMethod01Model
@{
}
<html>
  <head>

  </head>
  <body>
    <h2>OnGetメソッドによるURLパラメーターの取得</h2>
    <p>param1:@Model.p1</p>
    <p>param2:@Model.p2</p>
    <p>param3:@Model.p3</p>
  </body>
</html>
/Pages/UsingGetMethod01.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace GetUrlParameter.Pages
{
  public class UsingGetMethod01Model : PageModel
  {
    public string p1;
    public string p2;
    public string p3;

    public void OnGet(string param1, string param2, string param3)
    {
      p1 = param1;
      p2 = param2;
      p3 = param3;
    }
  }
}
Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
var app = builder.Build();

app.UseStaticFiles();
app.UseRouting();
app.MapRazorPages();
app.Run();

解説

OnGetメソッドに param1 param2 parame3 の引数を記述します。
アクセスしたURLの param1 パラメーターの値がOnGetの param1 引数に設定されてメソッドが実行されます。
受け取った引数をページモデルクラスの p1 p2 p3 メンバ変数に代入します。
    public void OnGet(string param1, string param2, string param3)
    {
      p1 = param1;
      p2 = param2;
      p3 = param3;
    }

代入した値は、RazorPageのページ内に表示されます。
    <p>param1:@Model.p1</p>
    <p>param2:@Model.p2</p>
    <p>param3:@Model.p3</p>

実行結果

プロジェクトを実行し、(アプリケーションルートURL)/UsingGetMethod01 にアクセスします。下図のページが表示されます。
パラメーターがないため、値は空欄になっています。


続いて、パラメーターを追加した (アプリケーションルートURL)/UsingGetMethod01?param1=penguin&param2=duck&param3=bear のURLにアクセスします。 下図のページが表示されます。param1の欄に"penguin"、param2の欄に"duck"、param3の欄に"bear"の文字が表示されており、 URLに与えたパラメータの値がOnGetメソッドで取得でき、ページ内に表示される動作が確認できます。

プログラム例:ルートパラメーター(URL拡張パス)がある場合でOnGetメソッドで取得する例 (.NET6)

ルート パラメーターを設定してURLに追加パス(拡張パス)がある場合のプログラム例です。

コード

先のプロジェクトに新しいRazorPageを追加し、下記のコードを記述します。
/Pages/UsingGetMethod02.cshtml
@page "/UsingGetMethod02/{mode}/{id:int}"
@model GetUrlParameter.Pages.UsingGetMethod02Model
@{
}
<html>
  <head>

  </head>
  <body>
    <h2>OnGetメソッドによるURLパラメーターの取得</h2>
    <p>mode:@Model.md</p>
    <p>id:@Convert.ToString(Model.iid)</p>
    <p>param1:@Model.p1</p>
    <p>param2:@Model.p2</p>
    <p>param3:@Model.p3</p>
  </body>
</html>
/Pages/UsingGetMethod02.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace GetUrlParameter.Pages
{

  public class UsingGetMethod02Model : PageModel
  {
    public string md;
    public int iid;
    public string p1;
    public string p2;
    public string p3;

    public void OnGet(string mode, int id, string param1, string param2, string param3)
    {
      md = mode;
      iid = id;
      p1 = param1;
      p2 = param2;
      p3 = param3;
    }
  }
}

解説

先の例と同様のコードですが、@page "/UsingGetMethod02/{mode}/{id:int}" が追加されており、mode と id の ルートパラメーターを追加しています。idは整数である必要があります。

ルートパラメーターの値もOnGetメソッドで取得し、メンバ変数に代入します。
    public void OnGet(string mode, int id, string param1, string param2, string param3)
    {
      md = mode;
      iid = id;
      p1 = param1;
      p2 = param2;
      p3 = param3;
    }

代入したメンバ変数をページ内に表示します。
    <p>mode:@Model.md</p>
    <p>id:@Convert.ToString(Model.iid)</p>
    <p>param1:@Model.p1</p>
    <p>param2:@Model.p2</p>
    <p>param3:@Model.p3</p>

実行結果

プロジェクトを実行します。Webブラウザで (アプリケーションルートURL)/UsingGetMethod02/get/8 のURLにアクセスします。 下図のページが表示されます。ルート パラメーターに設定した "get" と "8" がメソッドの引数で取得できページに表示されていることが確認できます。 パラメーターが設定されていない、param1-3 は空欄になっています。


続いて、 (アプリケーションルートURL)/UsingGetMethod02/get/8?param1=penguin&param2=duck&param3=owl のURLにアクセスします。
下図のページが表示されます。パラメーターとして追加したparam1, param2, param3 の値が取得でき、ページ内に表示されます。

プログラム例: Request.Queryオブジェクトを利用する例

従来の.NET Framework のWebFormアプリケーションと同様の方法でパラメーターを取得したい場合は、Request.Queryオブジェクトから パラメーターを取得する方法もあります。

コード

以下のRazor Pageを作成します。
UsingQueryString.cshtml
@page
@model GetUrlParameter.Pages.UsingQueryStringModel
@{
}
<html>
  <head>

  </head>
  <body>
    <h1>Request.Queryでのパラメーター取得のデモ</h1>
    <p>@Model.Output</p>
  </body>
</html>
UsingQueryString.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace GetUrlParameter.Pages
{
  public class UsingQueryStringModel : PageModel
  {
    public string Output { get; set; }

    public void OnGet()
    {
      if (0 < Request.Query["myparam"].Count) {
        string param = Request.Query["myparam"][0].ToString();
        Output = string.Format("myparamの値:{0}", param);
      }
    }
  }
}

解説

Request.Query["(パラメーター名)"] のコードにより、URLパラメーターを取得できます。 Queryオブジェクトは、IQueryCollection 型であり、複数の値を持ちます。
要素サイズを超える要素にアクセスすると、 System.IndexOutOfRangeException: 'Index was outside the bounds of the array.' が発生しますので、アクセス前にQueryオブジェクトのCountプロパティで 要素の個数を確認し、サイズを超えない範囲でのアクセスになるかを確認します。

通常は先頭の[0]の要素を取得するとパラメーターの文字列が取得できます。IQueryCollection の要素の値は Microsoft.Extensions.Primitives.StringValuesのため、 string型として扱うためには、ToString()メソッドでstringに変換する必要があります。
  if (0 < Request.Query["myparam"].Count) {
    string param = Request.Query["myparam"][0].ToString();
    Output = string.Format("myparamの値:{0}", param);
  }

Outputプロパティに設定された値は、Razor Pageのページ内に表示されます。
    <p>@Model.Output</p>

実行結果

プロジェクトを実行し、(アプリケーションルートURL)/UsingQueryString のURLにアクセスします。下図のページが表示されます。
パラメーターが何もないため、ページの表示も空です。


(アプリケーションルートURL)/UsingQueryString?myparam=Penguin のURLにアクセスします。下図のページが表示されます。
URLパラメーターの値が取得され "myparamの値:Penguin" の文字列がページに表示されます。


URLパラメーターを取得できました。

補足:Request.Query["(パラメータ名)"] の添え字が1以上の場合

先の例では、パラメータ取得時に以下のコードを記述しています。
Request.Query["myparam"][0].ToString();
添え字 0 を利用しており、通常は[0]の利用で問題ありませんが、1以上の添え字を使用する場合が稀にあります。
1以上の添え字の使用例を紹介します。

以下のRazor Pageを作成します。
UsingQueryString02.cshtml
@page
@model GetUrlParameter.Pages.UsingQueryString02Model
@{
}
<html>
  <head>

  </head>
  <body>
    <h1>Request.Queryでのパラメーター取得のデモ</h1>
    <p>@Model.Output1</p>
    <p>@Model.Output2</p>
    <p>@Model.Output3</p>
  </body>
</html>
UsingQueryString02.cshtml.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace GetUrlParameter.Pages
{
  public class UsingQueryString02Model : PageModel
  {
    public string Output1 { get; set; }
    public string Output2 { get; set; }
    public string Output3 { get; set; }

    public void OnGet()
    {
      if (0 < Request.Query["myparam"].Count) {
        string param1 = Request.Query["myparam"][0].ToString();
        Output1 = string.Format("myparamの値:{0}", param1);
      }

      if (1 < Request.Query["myparam"].Count) {
        string param2 = Request.Query["myparam"][1].ToString();
        Output2 = string.Format("myparamの値:{0}", param2);
      }

      if (2 < Request.Query["myparam"].Count) {
        string param3 = Request.Query["myparam"][2].ToString();
        Output3 = string.Format("myparamの値:{0}", param3);
      }
    }
  }
}

プロジェクトを実行し、(アプリケーションルートURL)/UsingQueryString02 のURLにアクセスします。下図のページが表示されます。
パラメーターが何もないため、ページの表示も空です。


(アプリケーションルートURL)/UsingQueryString02?myparam=Penguin のURLにアクセスします。下図のページが表示されます。
パラメーターがあるため、"myparamの値:Penguin" が表示されます。


(アプリケーションルートURL)/UsingQueryString02?myparam=Penguin&myparam=duck のURLにアクセスします。下図のページが表示されます。
myparam の同じパラメーター名でパラメータの値がありますが、どちらもページに表示されていることが確認できます。


(アプリケーションルートURL)/UsingQueryString02?myparam=Penguin&myparam=duck&myparam=camel のURLにアクセスします。下図のページが表示されます。
myparam の同じパラメーター名で3つパラメータの値がありますが、3つともページに表示されていることが確認できます。

補足:ルートパラメーター(URL拡張パス)がある場合でRequest.Queryを利用する場合

ルートパラメーター(URL拡張パス)がある場合でRequest.Queryを利用した場合にどのような結果になるかの紹介です。
以下のRazor Pageを作成します。
UsingQueryString03.cshtml
@page "/UsingQueryString03/{mode}/{id:int}"
@model GetUrlParameter.Pages.UsingQueryString03Model
@{
}
<html>
  <head>

  </head>
  <body>
    <h1>Request.Queryでのパラメーター取得のデモ(添え字1以上)</h1>
    <p>@Model.ModeOutput</p>
    <p>@Model.IDOutput</p>
    <p>@Model.ParamOutput</p>
  </body>
</html>
UsingQueryString03.cshtml.cs
using System;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;

namespace GetUrlParameter.Pages
{
  public class UsingQueryString03Model : PageModel
  {
    public string ModeOutput { get; set; }
    public string IDOutput { get; set; }
    public string ParamOutput { get; set; }

    public void OnGet()
    {
      if (0 < Request.Query["mode"].Count) {
        string param_mode = Request.Query["mode"][0].ToString();
        ModeOutput = string.Format("modeの値:{0}", param_mode);
      }

      if (0 < Request.Query["id"].Count) {
        int param_id = Convert.ToInt32(Request.Query["id"][0]);
        IDOutput = string.Format("id の値:{0}", param_id);
      }

      if (0 < Request.Query["myparam"].Count) {
        string param1 = Request.Query["myparam"][0].ToString();
        ParamOutput = string.Format("myparamの値:{0}", param1);
      }

    }
  }
}

(アプリケーションルートURL)/UsingQueryString03/Get/40 のURLにアクセスします。 下図のページが表示されます。ルートパラメーターの mode, id のパラメーターをRequest.Query オブジェクトから取得するコードを記述していますが、 ルートパラメーターはQueryオブジェクトには格納されておらず、パラメーターは画面に表示されないことがわかります。


続いて(アプリケーションルートURL)/UsingQueryString03/Get/40?myparam=PenguinのURLにアクセスします。
下図のページが表示されます。ルートパラメーターでないパラメーターはRequest.Query オブジェクトから取得でき、 myparamのパラメーターの値がページに表示されます。


補足
Requestオブジェクトからルートパラメーターを取得する場合は、RouteValuesオブジェクトを利用します。 詳しくはこちらの記事を参照してください。

プログラム例:OnGetメソッドで取得する例 (.NET 5以前)

コード

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

ページ

/Pages/index.cshtml
@page
@model GetUrlParameter.Pages.IndexModel
@{
}
<!DOCTYPE html>

<html>
<head>
  <meta name="viewport" content="width=device-width" />
  <title>ButtonFinish</title>
</head>
<body>
  <div>URLパラメーターのテスト</div>
  <div>Param1 : @Model.Param1Str</div>
  <div>Param2 : @Model.Param2Str</div>
  <div>Param3 : @Model.Param3Str</div>
</body>
</html>
/Pages/index.cshtml
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 IndexModel : PageModel
  {
    public string Param1Str;
    public string Param2Str;
    public string Param3Str;

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

実行結果

プロジェクトを実行します。Webブラウザが起動し、下図のページが表示されます。


パラメーターを追加した下記のURLでアクセスします。
(アプリケーションルートURL)/?param=PPP&amp;param2=QQQ&amp;param3=RRR
下図のページが表示されます。パラメーターの値がページに表示されることが確認できます。

プログラム例 : ルートパラメーター(URL拡張パス)がある場合でOnGetメソッドで取得する例 (.NET 5以前)

/Pages/Index.cshtml.cs
@page "{param1}/{param2}/{param3}"
@model GetUrlParameter.Pages.IndexModel
@{
}
<!DOCTYPE html>

<html>
<head>
  <meta name="viewport" content="width=device-width" />
  <title>ButtonFinish</title>
</head>
<body>
  <div>URLパラメーターのテスト</div>
  <div>Param1 : @Model.Param1Str</div>
  <div>Param2 : @Model.Param2Str</div>
  <div>Param3 : @Model.Param3Str</div>
</body>
</html>
/Pages/Index.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 IndexModel : PageModel
  {
    public string Param1Str;
    public string Param2Str;
    public string Param3Str;

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

解説

パラメーターを拡張パス形式で取得する場合は、@page ディレクティブにパラメーターのテンプレートを記述します。
@page "{param1}/{param2}/{param3}" の記述により、下記のパターンのURLでパラメータを受け取れます。
(アプリケーションルートURL)/param1/param2/param3

実行結果

プロジェクトを実行します。デフォルトページが表示されますが、@pageディレクティブのパターンにマッチしないため、404のNot Foundエラーが表示されます。


URLの拡張パスにパラメーターを追加した下記のURLにアクセスします。
(アプリケーションルートURL)/AAA/BBB/CCC
下図のページが表示されます。URLに入力したパラメーター名が取得できていることが確認できます。

参考 : ファイル名とは異なるページ名でパラメータを取得する場合

@pageディレクティブにページ名を記述することで、ファイル名と異なるページ名でアクセスを受け付ける動作にできます。
/Pages/Index.cshtml.cs
@page "/Main/Search/{param1}/{param2}/{param3}"
@model GetUrlParameter.Pages.IndexModel
@{
}
<!DOCTYPE html>

<html>
<head>
  <meta name="viewport" content="width=device-width" />
  <title>ButtonFinish</title>
</head>
<body>
  <div>URLパラメーターのテスト</div>
  <div>Param1 : @Model.Param1Str</div>
  <div>Param2 : @Model.Param2Str</div>
  <div>Param3 : @Model.Param3Str</div>
</body>
</html>

実行結果

URLの拡張パスにパラメーターを追加した下記のURLでアクセスします。下図のページが表示されます。
(アプリケーションルートURL)/Main/Search/111/222/333

参考 : OnGetの引数の順番を入れ替えた場合

Index.html.cs ファイルのOnGetメソッドの引数の順番を変えた場合の動作を確認します。
Index.html.csのコードを下記に修正します。
/Pages/Index.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 IndexModel : PageModel
  {
    public string Param1Str;
    public string Param2Str;
    public string Param3Str;

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

OnGetの引数の順番を変更しました。引数の変数名は変えていません。
修正前
    public void OnGet(string param1, string param2, string param3)
修正後
    public void OnGet(string param3, string param1, string param2)

編集後のコードを実行します。下記のURLでアクセスすると、下図の表示となります。引数の順番が変更されてもパラメータはずれなく表示できていることが確認できます。
(アプリケーションルートURL)/?param1=PPP&amp;param2=QQQ&amp;param3=RRR

参考 : OnGetの引数の名称をパラメータ名に合わせなかった場合

OnGetメソッドの引数名をパラメーター名と揃えなかった場合の例です。
/Pages/Index.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 IndexModel : PageModel
  {
    public string Param1Str;
    public string Param2Str;
    public string Param3Str;

    public void OnGet(string param3, string paramA, string paramB)
    {
      Param1Str = paramA;
      Param2Str = paramB;
      Param3Str = param3;
    }
  }
}

OnGetの引数名をパラメーター名と違う名称で記述しています。
修正前
    public void OnGet(string param1, string param2, string param3)
修正後
    public void OnGet(string param3, string paramA, string paramB)

編集後のコードを実行します。下記のURLでアクセスすると、下図の表示となります。引数の順番が変更された場合はパラメータは追従しましたが、引数の名称がパラメーター名と一致していない場合はパラメータの値は設定されないことが確認できます。今回のコードの例ではparam3がパラメーター名と一致しているため、param3の値のみが取得できています。
(アプリケーションルートURL)/?param1=PPP&amp;param2=QQQ&amp;param3=RRR

著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2022-07-27
改訂日: 2022-07-04
作成日: 2020-01-08
iPentec all rights reserverd.