0

用于响应编辑保存表单的标准生成代码块

[HttpPost]
public ActionResult Edit(User user)
{
  if (ModelState.IsValid)
  {
    db.Entry(user).State = EntityState.Modified;
    db.SaveChanges();
    return RedirectToAction("Index");
  }
 return View(user);
}

当所有字段都存在于编辑视图中时有效。

在我的模型中,我有一个密码字段(出于显而易见的原因)我不想作为不可见的表单字段传递。结果密码为空(这是意料之中的)。我应该如何编码来处理这种情况?

  1. 获取密码值,我应该从数据库中获取值吗?如果我使用:用户 u = db.User.Find(user.ID); EF 存在“ObjectStateManager 中已存在具有相同键的对象”的问题

  2. 我如何处理 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 上下文更改,它有效,但代码正确吗?

4

1 回答 1

2

if (ModelState.IsValid)

添加

if (string.IsNullOrEmpty(user.Password))
{
    ModelState.Remove("Password");
}

我想知道我是否有义务进行额外的数据库之旅来获取价值?我必须更改代码以修复 EF 上下文更改,它有效,但代码正确吗?

Do it in a different way. Don't use an entity object as your model. Create a model which contains only data you need to update,for example:

public class UserModel
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string Surname { get; set; }
}

and now:

[HttpPost]
public ActionResult Edit(UserModel userModel)
{

    if (ModelState.IsValid)
    {
        User user = db.Users.Find(userModel.Id);
        user.FirstName = userModel.FirstName ;
        user.Surname  = userModel.Surname;
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    return View(userModel);
}

I hope it helps.

于 2012-07-14T18:35:49.437 回答