用于响应编辑保存表单的标准生成代码块
[HttpPost]
public ActionResult Edit(User user)
{
if (ModelState.IsValid)
{
db.Entry(user).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
return View(user);
}
当所有字段都存在于编辑视图中时有效。
在我的模型中,我有一个密码字段(出于显而易见的原因)我不想作为不可见的表单字段传递。结果密码为空(这是意料之中的)。我应该如何编码来处理这种情况?
获取密码值,我应该从数据库中获取值吗?如果我使用:用户 u = db.User.Find(user.ID); EF 存在“ObjectStateManager 中已存在具有相同键的对象”的问题
我如何处理 ModelState.IsValid 因为它是假的
我已经找到了以前 mvc 版本的答案,但想知道实现这一目标的最优雅/最有效的方法是什么?
@freeride,我不必测试 user.Password 是否为空,我希望它为空,如果不是,那么它是由恶意用户注入的。整个 excersie 是为了避免用户操纵密码。
删除密码字段 (ModelState.Remove("Password");) 确实解决了 ModelState 验证问题。现在仍然是一个问题,如何恢复密码值?以下作品:
[HttpPost]
public ActionResult Edit(user user)
{
user v = db.Users.Find(user.ID);
ModelState.Remove("Pass");
user.Password = v.Password; // assign from db
if (ModelState.IsValid)
{
//db.Entry(user).State = EntityState.Modified; // this won't work as the context changed
db.Entry(v).CurrentValues.SetValues(user); // we need to use this now
db.SaveChanges();
return RedirectToAction("Index");
}
return View(user);
}
我想知道我是否有义务进行额外的数据库之旅来获取价值?我必须更改代码以修复 EF 上下文更改,它有效,但代码正确吗?