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));
        }
Example #2
0
        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));
 }
Example #5
0
 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));
        }
Example #9
0
        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));
        }