【问题标题】:asp.mvc 4 EF ActionResult Edit with not all fields in viewasp.mvc 4 EF ActionResult 编辑,并非所有字段都在视图中
【发布时间】:2012-07-17 01:02:02
【问题描述】:

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

[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 是否为 null,我希望它为 null,如果不是,那么它是由恶意用户注入的。整个 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 上下文更改,它可以工作,但代码正确吗?

【问题讨论】:

  • 你能把你的视图代码贴在这里吗...我认为如果你从视图中删除你的密码字段,保存时应该没有任何问题
  • @patel.milanb,当我删除它时,视图中没有密码字段。
  • @Darin Dimitrov,这毫无疑问是官方的做法,但是创建一个视图模型只在十几个表单上遗漏一个字段似乎有很多开销,我想知道是否有一个可行的捷径。
  • 是的,它存在,但我不会展示它,因为我讨厌宣扬不良做法。

标签: asp.net-mvc


【解决方案1】:

之前

if (ModelState.IsValid)

添加

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

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

以不同的方式进行。不要使用实体对象作为模型。 创建一个只包含您需要更新的数据的模型,例如:

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

现在:

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

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    相关资源
    最近更新 更多