asp-page-handler タグヘルパーを利用する - ASP.NET Core

asp-page-handler タグヘルパーを利用するコードを紹介します。

概要

Razor Pageのアクセス時に handlerパラメーターを付与し、OnGet(ハンドラ名) OnPost(ハンドラ名) のメソッドを実行する場合には、 asp-page-handler タグヘルパーを利用します。

プログラム例 : (Getでの利用)

コード

Razor Pageを2ページ作成します。
AspPageHandler.cshtml
@page
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@model TagHelperDemo.Pages.AspPageHandlerModel
@{
}
<html>
<head>
</head>
<body>
  <p>テストページ</p>
  <a asp-page="/MyAction" asp-page-handler="Register">リンク1 (asp-page-handler=Register)</a><br />
  <a asp-page="/MyAction" asp-page-handler="Update">リンク2 (asp-page-handler=Update)</a><br />
  <a asp-page="/MyAction" asp-page-handler="Delete">リンク3 (asp-page-handler=Delete)</a><br />
</body>
</html>
MyAction.cshtml
@page
@model TagHelperDemo.Pages.MyActionModel
@{
}
<html>
<head></head>
<body>
  <p>/MyAction ページ</p>
  <p>@Model.Message</p>
</body>
</html>
MyAction.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 TagHelperDemo.Pages
{
  public class MyActionModel : PageModel
  {
    public string Message { get; set; }

    public void OnGet()
    {
      Message = "OnGet() が呼び出されました。";
    }

    public void OnGetRegister()
    {
      Message = "OnGetRegister() が呼び出されました。";
    }

    public void OnGetUpdate()
    {
      Message = "OnGetUpdate() が呼び出されました。";
    }

    public void OnGetDelete()
    {
      Message = "OnGetDelete() が呼び出されました。";
    }

  }
}
Startup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

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

解説

AspPageHandler.cshtml

aタグのリンクを記述します。asp-page 属性を記述して遷移先のRazorPageを指定しています。asp-page属性の動作の詳細はこちらの記事を参照してください。
asp-page-handler属性を記述し、Handlerパラメータの設定もします。3つのリンクそれぞれのasp-page-handlerの値は異なる値にします。
  <a asp-page="/MyAction" asp-page-handler="Register">リンク1 (asp-page-handler=Register)</a><br />
  <a asp-page="/MyAction" asp-page-handler="Update">リンク2 (asp-page-handler=Update)</a><br />
  <a asp-page="/MyAction" asp-page-handler="Delete">リンク3 (asp-page-handler=Delete)</a><br />

MyAction.cshtml

ページモデルクラスに、OnGet(Handler名) のメソッドを実装します。
asp-page-handler の値が Register の場合は Handlerパラメータに "Register" の値が渡され、めーじモデルの OnGetRegister() メソッドが呼び出されます。 Message プロパティに呼び出されたメソッドに応じたメッセージを代入しています。
  public class MyActionModel : PageModel
  {
    public string Message { get; set; }

    public void OnGet()
    {
      Message = "OnGet() が呼び出されました。";
    }

    public void OnGetRegister()
    {
      Message = "OnGetRegister() が呼び出されました。";
    }

    public void OnGetUpdate()
    {
      Message = "OnGetUpdate() が呼び出されました。";
    }

    public void OnGetDelete()
    {
      Message = "OnGetDelete() が呼び出されました。";
    }
  }

Razor Pageではページモデルクラスの Message プロパティの値を表示します。
  <p>@Model.Message</p>

Startup.cs

Razor Pagesのルーティング処理を記述します。詳しくはこちらの記事を参照してください。

実行結果

上記のプロジェクトを実行します。Webブラウザで (アプリケーションルートURL)/AspPageHandler のURLにアクセスします。下図のページが表示されます。


[リンク1 (asp-page-handler=Register)] のリンクをクリックします。下図のページが表示されます。
handlerパラメーターに "Register" が設定され、ページモデルクラスの OnGetRegister メソッドが呼び出されるため、 ページには "OnGetRegister() が呼び出されました。"のメッセージが表示されます。


[リンク2 (asp-page-handler=Update)] のリンクをクリックします。下図のページが表示されます。
handlerパラメーターに "Update" が設定され、ページモデルクラスの OnGetUpdate メソッドが呼び出されるため、 ページには "OnGetUpdate() が呼び出されました。"のメッセージが表示されます。


同様に[リンク3 (asp-page-handler=Delete)] のリンクがクリックされた場合は、OngetDelete() メソッドが呼び出されます。

プログラム例 : (Postでの利用)

コード

AspPageHandlerPost.cshtml
@page
@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers
@model TagHelperDemo.Pages.AspPageHandlerPostModel
@{
}
<html>
<head>
</head>
<body>
  <p>テストページ</p>
  <form method="post">
    <p><input type="submit" asp-page="/MyActionPost" asp-page-handler="Update" value="POST(Update)" /></p>
    <p><input type="submit" asp-page="/MyActionPost" asp-page-handler="Delete" value="POST(Delete)" /></p>
    <p><input type="submit" asp-page="/MyActionPost" asp-page-handler="Copt" value="POST(Copy)" /></p>
  </form>
</body>
</html>
MyActionPost.cshtml
@page
@model TagHelperDemo.Pages.MyActionPostModel
@{
}
<html>
<head>
</head>
<body>
  <p>/MyActionPost ページ</p>
  <p>@Model.Message</p>
</body>
</html>
MyActionPost.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 TagHelperDemo.Pages
{
  public class MyActionPostModel : PageModel
  {
    public string Message { get; set; }
    public void OnGet()
    {
    }

    public void OnPost()
    {
      Message = "OnPost() が呼び出されました。";
    }

    public void OnPostUpdate()
    {
      Message = "OnPostUpdate() が呼び出されました。";
    }

    public void OnPostDelete()
    {
      Message = "OnPostDelete() が呼び出されました。";
    }

    public void OnPostCopy()
    {
      Message = "OnPostCopy() が呼び出されました。";
    }
  }
}
上記のプロジェクトを実行します。Webブラウザで (アプリケーションルートURL)/AspPageHandlerPost のURLにアクセスします。下図のページが表示されます。


[POST(Update)]のボタンをクリックします。handler パラメータに "Update" が指定され、OnPostUpdate() メソッドが呼び出されます。 画面には"OnPostUpdate() が呼び出されました。"のメッセージが表示されます。


[POST(Delete)]のボタンをクリックした場合は、handler パラメータに "Delete" が指定され、OnPostDelete() メソッドが呼び出されます。 画面には"OnPostDelete() が呼び出されました。"のメッセージが表示されます。


同様に [POST(Copy)]のボタンをクリックした場合は、OnPostCopy() メソッドが呼び出されます。


asp-page-handler タグヘルパーを利用して、ページ遷移先で OnGet(ハンドラ名)()OnPost(ハンドラ名)() のメソッドを切り替えて呼び出す動作を実装できました。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2021-05-14
iPentec all rights reserverd.