asp-page-handler タグヘルパーを利用する - ASP.NET Core
asp-page-handler タグヘルパーを利用するコードを紹介します。
概要
Razor Pageのアクセス時に
handler
パラメーターを付与し、
OnGet(ハンドラ名)
OnPost(ハンドラ名)
のメソッドを実行する場合には、
asp-page-handler
タグヘルパーを利用します。
プログラム例 : (Getでの利用)
コード
Razor Pageを2ページ作成します。
@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>
@page
@model TagHelperDemo.Pages.MyActionModel
@{
}
<html>
<head></head>
<body>
<p>/MyAction ページ</p>
<p>@Model.Message</p>
</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 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() が呼び出されました。";
}
}
}
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での利用)
コード
@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>
@page
@model TagHelperDemo.Pages.MyActionPostModel
@{
}
<html>
<head>
</head>
<body>
<p>/MyActionPost ページ</p>
<p>@Model.Message</p>
</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 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を愛用