Razor Pages でリダイレクト時にURLパラメーターを追加する - ASP.NET Core

Razor Pages でリダイレクト時にURLパラメーターを追加するコードを紹介します。

概要

Razor Pagesでリダイレクトする際には、Redirectメソッド、RedirectToPageメソッドが利用できます。Redirectメソッドの場合はURLを引数に与えるため、パラメーターの文字列をそのままURLの文字列にセットすれば対応できます。RedirectToPageメソッドの場合は第二引数にパラメーターのオブジェクトを与えます。

プログラム例

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

ページ

/Pages/main.cshtml
@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>
/Pages/main.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 RedirectPage.Pages
{
  public class mainModel : PageModel
  {
    public void OnGet()
    {

    }

    public IActionResult OnPost()
    {
      return RedirectToPage("/dest", new{ param1="AAA", param2="BBB", param3="CCC" });
    }
  }
}
/Pages/dest.cshtml
@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>
/Pages/dest.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 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&amp;param2=BBB&amp;param3=CCC

拡張パス(ディレクトリ)形式のパラメータにする場合

昨今のWebアプリケーションではパラメーターを
(アプリケーションURL)?パラメーター名1=値1&パラメーター名2=値2&パラメーター名3=値3&.....パラメーター名n=値n
の形式ではなく
(アプリケーションURL)/パラメーター名1の値/パラメーター名2の値/パラメーター名3の値/.../パラメーター名nの値
のパラメーターをURLの拡張パス形式で渡すものが多いです。
パラメーターをURLの拡張パス形式にする場合は、@pageディレクティブにテンプレートとなるパターンを記述すると対応できます。

dest.cshtml を下記のコードに変更します。
/Pages/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メソッドを利用することもできます。
Redirectメソッドを利用する例 (main.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 RedirectPage.Pages
{
  public class mainModel : PageModel
  {
    public void OnGet()
    {

    }

    public IActionResult OnPost()
    {
      return Redirect("/dest?param1=AAA&param2=BBB&param3=CCC");
    }
  }
}
Redirectメソッドを利用する例 (main.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 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
iPentec all rights reserverd.