了解です。
ASP.NET Core MVC で「毎月1日の初回アクセス時だけ Create.cshtml にダイアログを表示」するには、
サーバー側で「今月の初回アクセスかどうか」を判定し、ビューにフラグを渡して JavaScript でダイアログを出すのが安全です。
以下は セッション を使った実装例です。
(セッションはユーザーごとに保持されるため、同じユーザーが月初に一度だけ表示されます)
1. Program.cs(または Startup.cs)でセッション有効化
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllersWithViews();
builder.Services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromHours(1); // セッション有効期限
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});
var app = builder.Build();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseSession(); // セッションミドルウェア追加
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.Run();
2. コントローラーで「月初の初回アクセス」判定
using Microsoft.AspNetCore.Mvc;
public class SampleController : Controller
{
public IActionResult Create()
{
bool showDialog = false;
// 今日が1日かどうか
if (DateTime.Today.Day == 1)
{
string sessionKey = "FirstAccess_" + DateTime.Today.ToString("yyyyMM");
// セッションに記録がなければ初回アクセス
if (HttpContext.Session.GetString(sessionKey) == null)
{
showDialog = true;
HttpContext.Session.SetString(sessionKey, "shown");
}
}
ViewBag.ShowDialog = showDialog;
return View();
}
}
3. Create.cshtml でダイアログ表示
@{
ViewData["Title"] = "Create";
}
<h2>Create</h2>
<!-- フォームなど -->
@section Scripts {
<script>
document.addEventListener("DOMContentLoaded", function () {
var showDialog = '@(ViewBag.ShowDialog?.ToString().ToLower())';
if (showDialog === 'true') {
alert("『繰越金額』を入力してください");
}
});
</script>
}
動作仕様
- 毎月1日にアクセスした場合のみ判定。
- 同じユーザーがその月に初めてアクセスしたときだけ
alert が表示されます。 - 2回目以降はセッションに記録されるため表示されません。
- ユーザー単位での制御(全員共通で1回だけにしたい場合は DB やキャッシュを使う)。
💡 補足
- 全ユーザー共通で「月初の初回アクセス時だけ」表示したい場合は、セッションではなく DB や分散キャッシュ(Redis など) に「今月は表示済みか」を記録する必要があります。
- JavaScript のみで日付判定すると、ユーザーがページを再読み込みするたびに出てしまうため、必ずサーバー側で制御するのが安全です。
もし「全ユーザー共通で月初に一度だけ」表示するバージョンのコードも必要なら、DB を使ったサンプルも作れますが、作成しますか?
そうすれば管理者が一度アクセスした時点で全員に表示済み扱いにできます。
Powered by Froala Editor