Razor Pages でリダイレクト時にURLパラメーターを追加するコードを紹介します。
概要
Razor Pagesでリダイレクトする際には、Redirectメソッド、RedirectToPageメソッドが利用できます。Redirectメソッドの場合はURLを引数に与えるため、パラメーターの文字列をそのままURLの文字列にセットすれば対応できます。RedirectToPageメソッドの場合は第二引数にパラメーターのオブジェクトを与えます。
プログラム例
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 RedirectPage
{
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 "/"
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@model RedirectPage.Pages.mainModel
@{
}
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title></title>
</head>
<body>
<div>リダイレクトのデモ</div>
<form method="post">
<button>リダイレクト</button>
</form>
</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 RedirectPage.Pages
{
public class mainModel : PageModel
{
public void OnGet()
{
}
public IActionResult OnPost()
{
return RedirectToPage("/dest", new{ param1="AAA", param2="BBB", param3="CCC" });
}
}
}
@page
@model RedirectPage.Pages.destModel
@{
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>ButtonFinish</title>
</head>
<body>
ボタンがクリックされました。
<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 RedirectPage.Pages
{
public class destModel : 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;
}
}
}
解説
Startup.csはRazor Pagesアプリケーションの基本のコードです。詳しくは
こちらの記事を参照して下さい。
main.cshtmlにはサブミットボタンを配置しボタンクリックでPOSTする動作にします。main.cshtml.csにはOnPostメソッドを実装し、POSTを受け取ったらリダイレクトする動作にします。リダイレクトでは3つのパラメータを追加します。
dest.cshtml, dest.cshtml.cs ではページにアクセスした際に、URLに追加されているパラメータを取得し、画面に表示します。URLパラメータの取得の詳細については
こちらの記事を参照して下さい。
実行結果
上記のプロジェクトを実行します。Webブラウザが起動し、下図のページが表示されます。
[リダイレクト]ボタンをクリックします。distページが表示され、パラメーターの内容がページに表示されることが確認できます。
URLは下記の形式であることがわかります。
リダイレクトURL
(アプリケーションルートURL)/dist?param1=AAA&param2=BBB&param3=CCC
拡張パス(ディレクトリ)形式のパラメータにする場合
昨今のWebアプリケーションではパラメーターを
(アプリケーションURL)?パラメーター名1=値1&パラメーター名2=値2&パラメーター名3=値3&.....パラメーター名n=値n
の形式ではなく
(アプリケーションURL)/パラメーター名1の値/パラメーター名2の値/パラメーター名3の値/.../パラメーター名nの値
のパラメーターをURLの拡張パス形式で渡すものが多いです。
パラメーターをURLの拡張パス形式にする場合は、@pageディレクティブにテンプレートとなるパターンを記述すると対応できます。
dest.cshtml を下記のコードに変更します。
@page "{param1}/{param2}/{param3}"
@model RedirectPage.Pages.destModel
@{
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>ButtonFinish</title>
</head>
<body>
ボタンがクリックされました。
<div>Param1 : @Model.Param1Str</div>
<div>Param2 : @Model.Param2Str</div>
<div>Param3 : @Model.Param3Str</div>
</body>
</html>
解説
@pageディレクティブを、下記にすることで、
/dist/パラメーター1の値/パラメーター2の値/パラメーター3の値
の形式でパラメータを受け取ることができます。
@page "{param1}/{param2}/{param3}"
表示結果
プロジェクトを実行しWebブラウザでメインのページを開き[リダイレクト]ボタンをクリックします。下図のページが表示されます。パラメーターの値がページに表示されることが確認できます。
リダイレクトのURLは下記の形式であることがわかります。
リダイレクトURL
(アプリケーションルートURL)/dist/AAA/BBB/CCC
拡張パス(ディレクトリ)形式のパラメータにする場合 (ページ名も変わる場合)
元のファイル名と違うページ名にする場合のコード例を紹介します。
@page "/Complete{param1}/{param2}/{param3}"
@model RedirectPage.Pages.destModel
@{
}
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width" />
<title>ButtonFinish</title>
</head>
<body>
ボタンがクリックされました。
<div>Param1 : @Model.Param1Str</div>
<div>Param2 : @Model.Param2Str</div>
<div>Param3 : @Model.Param3Str</div>
</body>
</html>
解説
@pageディレクティブを、下記にすることで、
/Complete/パラメーター1の値/パラメーター2の値/パラメーター3の値
の形式でパラメータを受け取ることができます。
@page "/Complete{param1}/{param2}/{param3}"
表示結果
プロジェクトを実行しWebブラウザでメインのページを開き[リダイレクト]ボタンをクリックします。下図のページが表示されます。パラメーターの値がページに表示されることが確認できます。
リダイレクトのURLは下記の形式であることがわかります。
リダイレクトURL
(アプリケーションルートURL)/Complete/AAA/BBB/CCC
参考:Redirectメソッドを利用する場合
上記のリダイレクト処理では、RedirectToPageメソッドを利用しましたが、URLの文字列を直接与える、Redirectメソッドを利用することもできます。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace RedirectPage.Pages
{
public class mainModel : PageModel
{
public void OnGet()
{
}
public IActionResult OnPost()
{
return Redirect("/dest?param1=AAA¶m2=BBB¶m3=CCC");
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
namespace RedirectPage.Pages
{
public class mainModel : PageModel
{
public void OnGet()
{
}
public IActionResult OnPost()
{
return Redirect("/Complete/AAA/BBB/CCC");
}
}
}
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2020-01-09
作成日: 2020-01-08