如何防止实体框架对象的属性在默认编辑操作中被更改?

本文关键字:操作 编辑 默认 实体 何防止 框架 对象 属性 | 更新日期: 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)