public ActionResult Edit([Bind(Include = "Id,UserName,Password,RoleIds")] UserEditViewModel user) { var roles = db.Roles.Where(role => user.RoleIds.Contains(role.Id)).ToList(); if (ModelState.IsValid) { var dbUser = db.Users.Find(user.Id); if (dbUser == null) { return(HttpNotFound()); } //dbUser.UserName = user.UserName; if (!string.IsNullOrEmpty(user.Password) && !dbUser.Password.Equals(user.Password)) { dbUser.Password = this.membershipProvider.GeneratePasswordHash(dbUser.UserName, user.Password); } dbUser.Roles.Clear(); foreach (var role in roles) { dbUser.Roles.Add(role); } db.Entry(dbUser).State = EntityState.Modified; db.SaveChanges(); return(RedirectToAction("Index")); } this.SetRoles(roles); return(View(user)); }
public IHttpActionResult PutTodo(int id, Todo todo) { if (!ModelState.IsValid) { return(BadRequest(ModelState)); } if (id != todo.id) { return(BadRequest()); } db.Entry(todo).State = EntityState.Modified; try { db.SaveChanges(); } catch (DbUpdateConcurrencyException) { if (!TodoExists(id)) { return(NotFound()); } else { throw; } } return(StatusCode(HttpStatusCode.NoContent)); }
public ActionResult Edit([Bind(Include = "Id,UserName,Password,RoleIds")] User user) // Bind先プロパティとしてRoleIdsを追加 { // ロールListBoxに対応しているのはUser.RoleIdsプロパティ(Role.Idのリスト)のため、これを元に選択されたRoleのリストを取得。 var selectedRoles = db.Roles.Where(role => user.RoleIds.Contains(role.Id)).ToList(); if (ModelState.IsValid) { /* [ダメなパターン1] 例外は発生しないが、Roleの変更がDBに反映されない。 * // userパラメーターを元に変更を行う。 * // userパラメーターのRolesプロパティ(null)に、選択されたRoleのリストを設定する。 * user.Roles = selectedRoles; * db.Entry(user).State = EntityState.Modified; */ /* [ダメなパターン2] ~ = EntityState.Modified行で例外(Attaching an entity of type 'TodoWebApp.Models.User' failed because another entity of the same type already has the same primary key value.)が発生。 * // userパラメーターを元に変更を行う。 * // userパラメーターのRolesプロパティ(null)に、DBから取得したUserのRolesプロパティ値をセットし、それをClearしてから選択されたRoleのリストを設定する。 * var dbUser = db.Users.Find(user.Id); * if (dbUser == null) * { * return HttpNotFound(); * } * user.Roles = dbUser.Roles; * user.Roles.Clear(); * user.Roles = selectedRoles; * db.Entry(user).State = EntityState.Modified; */ /* [OKのパターン1] */ // DBから取得したUserを元に変更を行う。 // DBのUserのRolesプロパティ値を、Clearしてから選択されたRoleのリストを設定することで、正しく更新できる。 var dbUser = db.Users.Find(user.Id); if (dbUser == null) { return(HttpNotFound()); } dbUser.UserName = user.UserName; if (!dbUser.Password.Equals(user.Password)) // パスワードが変更された時のみパスワードを設定 { dbUser.Password = _membershipProvider.GeneratePasswordHash(user.UserName, user.Password); // パスワードをハッシュ化 } dbUser.RoleIds = user.RoleIds; dbUser.Roles.Clear(); dbUser.Roles = selectedRoles; db.Entry(dbUser).State = EntityState.Modified; db.SaveChanges(); return(RedirectToAction("Index")); } // ModelState.IsValid=falseの場合にも入力画面に戻るために、DBから全Roleを取得しリストボックス表示用に加工(ViewBag.RoleIdsの設定)が必要。 // この際、リストボックス選択状態を復元するために、画面で選択されたRoleのコレクションを引数として渡す。 this.SetRoles(selectedRoles); return(View(user)); }
[ValidateAntiForgeryToken] // クロスサイトリクエストフォージェリ(CSRF)対策の属性。PostされてきたTokenを自動的に検証してくれる。対応するViewのフォームでも@Html.AntiForgeryToken()メソッドを呼ぶこと。 public ActionResult Edit([Bind(Include = "Id,Summary,Detail,Limit,Done")] Todo todo) { if (ModelState.IsValid) { db.Entry(todo).State = EntityState.Modified; db.SaveChanges(); return(RedirectToAction(nameof(Index))); } return(View(todo)); }
public ActionResult Edit([Bind(Include = "Id,Summary,Detail,Limit,Done")] Todo todo) { if (ModelState.IsValid) { db.Entry(todo).State = EntityState.Modified; //該当のデータをセットして更新できる db.SaveChanges(); //更新を反映する return(RedirectToAction("Index")); } return(View(todo)); }
public ActionResult Edit([Bind(Include = "id,summary,detail,limit,done")] Todo todo) { if (ModelState.IsValid) { db.Entry(todo).State = EntityState.Modified; db.SaveChanges(); return(RedirectToAction("Index")); } return(View(todo)); }
public ActionResult Edit([Bind(Include = "Id,Summary,Detail,Limit,Done")] Todo todo) { if (ModelState.IsValid) { //stateプロパティにModifiedをセットすることで該当のtodoを更新 db.Entry(todo).State = EntityState.Modified; db.SaveChanges(); return(RedirectToAction("Index")); } return(View(todo)); }
public ActionResult Edit([Bind(Include = "Id,UserName,Password,RoleIds")] User user) { //画面で選択されているユーザのロールを取得する var roles = db.Roles.Where(role => user.RoleIds.Contains(role.Id)).ToList(); if (ModelState.IsValid) { var dbUser = db.Users.Find(user.Id); if (dbUser == null) { return(HttpNotFound()); } dbUser.UserName = user.UserName; //入力したパスワードとDBに格納されたパスワードが異なる場合 if (!dbUser.Password.Equals(user.Password)) { //ハッシュ化してDBに登録する dbUser.Password = this.membershipProvider.GeneratePasswordHash(user.UserName, user.Password); } dbUser.Roles.Clear(); //新しいロールを作成する foreach (var role in roles) { dbUser.Roles.Add(role); } //dbUserを更新 db.Entry(dbUser).State = EntityState.Modified; db.SaveChanges(); return(RedirectToAction("Index")); } //入力内容を復元 this.SetRoles(roles); return(View(user)); }
public ActionResult Edit([Bind(Include = "Id,UserName,Password,RoleIds")] User user) { var roles = db.Roles.Where(role => user.RoleIds.Contains(role.Id)).ToList(); if (ModelState.IsValid) { var dbUser = db.Users.Find(user.Id); if (dbUser == null) { return(HttpNotFound()); } dbUser.UserName = user.UserName; //パスワード変更が編集画面でパスワードが変更されていないかも if (!dbUser.Password.Equals(user.Password)) { dbUser.Password = this.membershipProvider.GeneratePasswordHash(user.UserName, user.Password); } //パスワードハッシュ化につき、元の処理削除 //dbUser.Password = user.Password; dbUser.Roles.Clear(); foreach (var role in roles) { dbUser.Roles.Add(role); } db.Entry(dbUser).State = EntityState.Modified; db.SaveChanges(); return(RedirectToAction("Index")); } //入力に不備があった場合 this.SetRoles(roles); return(View(user)); }