【ASP.NET(C#)6】フォームの入力内容を次回から省略。Cookieの設定方法(.NET 6)

今回は下記のようなフォームを使用する時に名前等、一回書き込んだ後は、次回の入力を省略した方が良いデータを実装する方法をご紹介します。

Cookieを使う

ある程度Webに詳しい方ならわかると思いますが、こういった技術にはCookieを使用します。Cookieは最近だとGoogle広告やYahoo!トップの下に伸びる記事などユーザの興味あるものを出すのにも使われています。
※Cookieに関する詳しい説明はここでは省かせて頂きます。

Cookieに関するコードも現在では.NET Framework時代のものと.NET Core以降とでは違う所がありますので今回はその違いを説明したいと思います。

.NET Framework(CoreがついていないASP.NET MVC)時代

今でも「C# Cookie」でGoogle検索すると1ページ目に10年前後のCookie設定記事がヒットします><、

さすがに今のご時勢にASP.NET MVCで新規開発する方は.NET 6で開発した方が良いので情報のアップデートをするため、まとめの意味も込めて「現在では使用できないNGのやり方を先に紹介したいと思います」

現在NG1:HttpContext.Current.Response.Cookies[“任意の文字列”].Value

昔はこの方法でCookieを設定していたようですが、この指定は.NET 6 では使えません
取得時も同様です。

現在NG2: HttpResponse.Cookies[“任意の文字列”].Value

こちらはHttpResponseを使ったCookieの設定ですが、こちらはそもそもソース内部だけでやりとりが簡潔するWebアプリケーション向けではないことと、HttpResponse.Cookies プロパティの用途も変わっているため、.NET 6では設定ができません

HttpResponse自体が外部で画面制御を持っていてAPIとして利用する時向けでしょうね。

上記画像の注意文を見て頂ければわかりますが、現在は読み取り専用プロパティになっていて上記のような使い方ができないのです。 {get;}はgetterのみ設定されていてセットできません。

.NET Core(.NET 6 含む)時代

一応検索した見つけた中で最新は2018/6の .NET Core 2.1の時の下記記事でした。(それでも4年前)

https://ichiroku11.hatenablog.jp/entry/2018/08/16/223220

上記記事に書いてある設定内容と.NET 6 で設定方法は変わっていませんでしたので.NET Core 3.1もこれで問題ないと思います。

HttpContext.Response.Cookies.Append(“任意の文字列”, 好きな値)

.NET 6 もこれでCookieを設定することができます。今回イナコーのWebアプリは以下のようにして実装しました。CookieOptionsも利用すれば設定時のオプションを変更することができます。こちらについては後述します。

設定時

CookieOptions cookieOptions = new CookieOptions();
cookieOptions.Secure = true;
cookieOptions.Expires = DateTime.UtcNow.AddDays(7);
HttpContext.Response.Cookies.Append("INAKO-NameCookie", artcle.Name, cookieOptions);

HttpContext.Request.Cookies.TryGetValue(” 任意の文字列 “, out var value))

TryGetValue は入ってなければらないのでnullエラーでず入っていればvalueに中身を入れて中の処理をしてくれる便利なものです。有無を判定しない場合は下記でとれます。

HttpContext.Request.Cookies["test"]
var viewModel = new ArticleIndexViewModel()
{
    artcle = new ArticleEntity(),
    artcles = await _context.ArticleEntity.OrderByDescending(x => x.Updated).ToListAsync()
};

// Cookies から名前を読み出し、設定
if (HttpContext.Request.Cookies.TryGetValue("INAKO-NameCookie", out var value))
{
    viewModel.artcle.Name = value;
}
return View(viewModel);

cookieOptions

Cookieのオプションの設定ですが、こちらの中身はC#でなく、JavaScriptでの説明の方が詳しかったです。

Cookies(クッキー), document.cookie

特に、secureや、expires, max-ageについての違いが書かれていたのはよかったですね。Microsoftでの説明ですと一言で終わっている上に使い方の例も見つからず、違いを理解するのに苦労しました。

secure=SSL標準として機能する時にチェック。
expires=UTC指定で指定の日になったら無効にする
max-age=設定してからTimespan型で設定秒経過したら無効にする

まとめ

CookieはC#だけでなく、JavaScriptでも過去は掲示板の主流だったCGIでも設定できるものなので結構昔からあります。初心者の方でWebアプリケーションを作る時には覚えておきたいですね。

ASP.NETはやはり他Webアプリケーションと比べると情報が少ないためか古いバージョンの情報が未だに多く残っています。バージョンアップを重ねる毎に最近のASP.NET Core MVCも他MVCフレームワークに負けないくらい使いやすくなっていると思いますのでこの機に私が率先して情報が更新できればいいなと思いました。