如何防止在默认编辑操作中更改Entity Framework对象的属性?

时间:2014-07-02 22:19:55

标签: c# asp.net asp.net-mvc entity-framework asp.net-mvc-4

这是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。为了防止这种情况,我需要更改什么?

2 个答案:

答案 0 :(得分:1)

当前对实体状态的更改标记了要更新的所有列。我会将代码更改为:

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);
}

跟踪调用saveUserdb.Attach(saveUser)的每次更改都会进行更新。 (但是,如果用户不在数据库中,这将产生SQL异常。)

答案 1 :(得分:0)

如果您要从视图中删除它们,它们将被发布为null,而不是使用Html.HiddenFor()帮助程序为它们创建隐藏字段,以便它们以隐藏的形式发布,但用户将无法编辑它们:

@Html.HiddenFor(x=>x.HashedPassword)
@Html.HiddenFor(x=>x.IsGlobalAdmin)