目次
前提となる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メソッドにログイン中ユーザーの情報を絡ませるのはめちゃくちゃ簡単でしたね!
コメント