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

この記事は約 3 分で読めます。

前提となるModelの構造

TodoMODELの構造

    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; }
    }

TodoModelには、IDがあります。

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

UserModelの構造

    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; }
    }

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

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

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

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

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

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

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

どういうことか。

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

        [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);
        }

注目すべきはここ!

var loginUser = GetLoginUser();

とここ

todo.User = loginUser;

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

        private User GetLoginUser()
        {
            return db.Users.FirstOrDefault(u => u.UserName == User.Identity.Name);
        }

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

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

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

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

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA