这是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);
}
此处未列出的一些属性已从编辑视图中删除:
每次保存此表单时,这些值都将变为NULL。为了防止这种情况,我需要更改什么?
答案 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);
}
跟踪调用saveUser
后db.Attach(saveUser)
的每次更改都会进行更新。 (但是,如果用户不在数据库中,这将产生SQL异常。)
答案 1 :(得分:0)
如果您要从视图中删除它们,它们将被发布为null,而不是使用Html.HiddenFor()
帮助程序为它们创建隐藏字段,以便它们以隐藏的形式发布,但用户将无法编辑它们:
@Html.HiddenFor(x=>x.HashedPassword)
@Html.HiddenFor(x=>x.IsGlobalAdmin)