動くコード図鑑技術記事現場の渡り方キャリア論すべての記事About
技術記事

ASP.NETでCreate時にログイン中ユーザーのデータとして登録する方法

バイブス父さん
現役の業務SE
2020年2月10日3 min read
ASP.NETでCreate時にログイン中ユーザーのデータとして登録する方法

前提となるModelの構造

TodoMODELの構造

TodoMODELの構造 (csharp)#38715cea3d9b
    public class Todo
    {
        public int Id { get; set; }
        public string Sammary { get; set; }
        public string Detail { get; set; }
        public DateTime Limit { get; set; }
        public bool Done { get; set; }
 
        public virtual User User { get; set; }
    }
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です

TodoModelには、IDがあります。

また概要と詳細があり、期限と完了フラグがあります。

UserModelの構造

UserModelの構造 (csharp)#17084a70a2be
    public class User
    {
        public int id { get; set; }
        public string UserName { get; set; }
        public string Password { get; set; }
        public virtual ICollection<Todo> todoes { get; set; }
    }
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です

こちらもシンプルにUserIDとNameとPassword。そして、Todoを複数持っているといった感じですね。

Createでログインユーザーの情報を付与して登録する。

別記事でIndexとDetailsでログインユーザーの情報を絞って表示するということを解説しました。

が、そもそもその情報がログインユーザーに紐づいていないと、いくら正しいコードを書いていても表示できません。

ということで今回は、ログインユーザーの情報を付与して登録をする方法を解説していきます。

TodoModelがUserを保持している点に注目

結論。TodoModelのUserにログインユーザーの情報を持たせてしまえば終わりです。

どういうことか。

スキャフォールドで作成したCreateメソッドは下記。

TodoModelがUserを保持している点に注目 (csharp)#0c46100ec080
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create([Bind(Include = "Id,Sammary,Detail,Limit,Done")] Todo todo)
        {
            var loginUser = GetLoginUser();
 
            if (ModelState.IsValid)
            {
                todo.User = loginUser;
                db.Todoes.Add(todo);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
 
            return View(todo);
        }
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です

注目すべきはここ!

var loginUser = GetLoginUser();

とここ

todo.User = loginUser;

GetLoginUserの中はこうなってます!

TodoModelがUserを保持している点に注目 (csharp)#31edbf235b99
        private User GetLoginUser()
        {
            return db.Users.FirstOrDefault(u => u.UserName == User.Identity.Name);
        }
▸ この snippet は実行結果未収録
▸ 実行結果は未収録です

コードをつなげてみてみると下記のような感じになります。

var loginUser = db.Users.FirstOrDefault(u => u.UserName == User.Identity.Name);
todo.User = loginUser;

ログイン中ユーザーの情報を取得し、それを今回新たに登録するtodoのUserに入れて登録するという感じですね。

Createメソッドにログイン中ユーザーの情報を絡ませるのはめちゃくちゃ簡単でしたね!

この記事のコードと手順は ぜんぶ動作検証済み。 安心して現場で試してくれ。
バイブス父さん

現役の業務SE。C# / SQL Server 保守の現場から、コードも人もキャリアも全部書く。 実体験ベース。

運営者について