Requestオブジェクトからルートパラメーターを取得する場合は、RouteValuesオブジェクトを利用します。
詳しくはこちらの記事を参照してください。
@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>
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;
}
}
}
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
var app = builder.Build();
app.UseStaticFiles();
app.UseRouting();
app.MapRazorPages();
app.Run();
param1
param2
parame3
の引数を記述します。p1
p2
p3
メンバ変数に代入します。 public void OnGet(string param1, string param2, string param3)
{
p1 = param1;
p2 = param2;
p3 = param3;
}
<p>param1:@Model.p1</p>
<p>param2:@Model.p2</p>
<p>param3:@Model.p3</p>
(アプリケーションルートURL)/UsingGetMethod01
にアクセスします。下図のページが表示されます。(アプリケーションルートURL)/UsingGetMethod01?param1=penguin¶m2=duck¶m3=bear
のURLにアクセスします。
下図のページが表示されます。param1の欄に"penguin"、param2の欄に"duck"、param3の欄に"bear"の文字が表示されており、
URLに与えたパラメータの値がOnGetメソッドで取得でき、ページ内に表示される動作が確認できます。@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>
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
は整数である必要があります。 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>
(アプリケーションルートURL)/UsingGetMethod02/get/8
のURLにアクセスします。
下図のページが表示されます。ルート パラメーターに設定した "get" と "8" がメソッドの引数で取得できページに表示されていることが確認できます。
パラメーターが設定されていない、param1-3 は空欄になっています。(アプリケーションルートURL)/UsingGetMethod02/get/8?param1=penguin¶m2=duck¶m3=owl
のURLにアクセスします。@page
@model GetUrlParameter.Pages.UsingQueryStringModel
@{
}
<html>
<head>
</head>
<body>
<h1>Request.Queryでのパラメーター取得のデモ</h1>
<p>@Model.Output</p>
</body>
</html>
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プロパティで
要素の個数を確認し、サイズを超えない範囲でのアクセスになるかを確認します。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);
}
<p>@Model.Output</p>
(アプリケーションルートURL)/UsingQueryString
のURLにアクセスします。下図のページが表示されます。(アプリケーションルートURL)/UsingQueryString?myparam=Penguin
のURLにアクセスします。下図のページが表示されます。Request.Query["myparam"][0].ToString();
0
を利用しており、通常は[0]の利用で問題ありませんが、1以上の添え字を使用する場合が稀にあります。@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>
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にアクセスします。下図のページが表示されます。(アプリケーションルートURL)/UsingQueryString02?myparam=Penguin&myparam=duck
のURLにアクセスします。下図のページが表示されます。(アプリケーションルートURL)/UsingQueryString02?myparam=Penguin&myparam=duck&myparam=camel
のURLにアクセスします。下図のページが表示されます。@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>
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にアクセスします。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();
});
}
}
}
@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>
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;
}
}
}
(アプリケーションルートURL)/?param=PPP&param2=QQQ&param3=RRR
@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>
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 "{param1}/{param2}/{param3}"
の記述により、下記のパターンのURLでパラメータを受け取れます。(アプリケーションルートURL)/param1/param2/param3
(アプリケーションルートURL)/AAA/BBB/CCC
@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)/Main/Search/111/222/333
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;
}
}
}
public void OnGet(string param1, string param2, string param3)
public void OnGet(string param3, string param1, string param2)
(アプリケーションルートURL)/?param1=PPP&param2=QQQ&param3=RRR
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)/?param1=PPP&param2=QQQ&param3=RRR