やりたいこと
・ASP.NET CORE 環境下
・Webアプリ
・ログインユーザーの権限でタグ(<button>や<div>)の表示/非表示切り替え
・できるだけ簡潔に実現
実行結果イメージ
test2権限が割り振られていた test2ボタンと test2 divが非表示になった。
実装方法(HTML側のイメージ)
<button authcode="test1">test1 ボタン</button>
<button authcode="test2">test2 ボタン</button>
<button>authcodeなし ボタン</button>
<div authcode="test1">
test1 div
</div>
<div authcode="test2">
test2 div
</div>
<div>
authcodeなし div
</div>
authcode="test1"
これが権限に対応します。test1利用者に対応します。
authcode="test2"
こちらは。test2利用者に対応します。
実装方法(C#側のイメージ)
using Microsoft.AspNetCore.Razor.TagHelpers;
namespace CustomTagHelper.Pages
{
// authcodeに対応させるタグをアノテーションで指定
[HtmlTargetElement("div", Attributes = "authcode")]
[HtmlTargetElement("button", Attributes = "authcode")]
public class AuthTagHelper : TagHelper
{
public string authcode { get; set; } = string.Empty;
public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
// 条件に合致しない場合はタグを非表示
if (!IsAuthorizedToShow(authcode))
{
output.SuppressOutput();
}
return Task.CompletedTask;
}
private bool IsAuthorizedToShow(string authCode)
{
// AuthCodeとユーザー名に基づいて表示可否を判定
// サンプルの判定ロジック
if (User.Name == "ALL") return true;
return (authCode == User.Name);
}
}
}
自由なロジックで権限判定可能です。
今回は条件に該当した場合、
output.SuppressOutput();
しているのでタグの出力そのものが無くなります。
Disabled(非表示以外)
実装方法(C#側のイメージ)
public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output)
{
// --- 非表示の場合 ---------------
// 条件に合致しない場合はタグを非表示
// output.SuppressOutput();
// --- disabledの場合 ---------------
// 'disabled' 属性を追加
output.Attributes.SetAttribute("disabled", "disabled");
// 必要に応じてスタイルやクラスも追加できる
output.Attributes.SetAttribute("class", "btn-disabled");
}
完全なソース