如何防止实体框架对象的属性在默认编辑操作中被更改?
本文关键字:操作 编辑 默认 实体 何防止 框架 对象 属性 | 更新日期: 2023-09-27 18:11:09
这是MVC 4生成的默认编辑/更新操作:
// POST: /User/Edit/5
// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = "ID,FirstName,LastName,EmailAddress,Company")] User user)
{
if (ModelState.IsValid)
{
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(user);
}
有几个属性没有在这里列出,我已经从编辑视图中删除:
- HashedPassword
- IsGlobalAdmin
这些值在每次保存此表单时都变为NULL。我需要做什么改变来防止这种情况?
当前对Entity State的更改标记了所有要更新的列。我会将代码更改为:
public ActionResult Edit(User user)
{
if (ModelState.IsValid)
{
User saveUser = new User { ID = user.ID }
db.Attach(saveUser);
saveUser.FirstName = user.FirstName
saveUser.LastName = user.LastName
saveUser.EmailAddress = user.EmailAddress;
saveUser.Company = user.Company;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(user);
}
调用db.Attach(saveUser)
后对saveUser
的每个更改都被跟踪以进行更新。(如果用户不在数据库中,这将给出一个SQL异常)
如果您将它们从视图中删除,它们将被发布为null,而不是使用Html.HiddenFor()
helper为它们创建隐藏字段,以便它们在表单中作为隐藏字段发布,但用户将无法编辑它们:
@Html.HiddenFor(x=>x.HashedPassword)
@Html.HiddenFor(x=>x.IsGlobalAdmin)