5

我是 asp.net mvc 4 和 EF 的新手。我正在创建创建/更新用户信息的用户模型。模型代码如下:

....
public int UserID { get; set; }

[Required]
public string UserName { get; set; }

[Required]
public string Password { get; set; }

[Compare("Password")]   
public string VerifyPassword { get; set; }
.....
 SOME OTHER FIELDS COMES HERE
......

该模型用于创建/更新活动。这适用于创建用户,但在更新时我不希望用户更新他的 ID、用户名,所以我将其保留为只读,也不想显示用户密码/验证密码字段,因此我将其从视图中删除。现在在更新(编辑模式)时,我总是收到密码字段的验证错误消息。所以我的问题是如何避免更新这些字段并更新其他字段。为了解决这个问题,我尝试创建视图模型,但它对我没有帮助。还在控制器中添加了用于绕过验证的代码:

public ActionResult Edit(User user)
{
   ModelState.Remove("Password");
   ModelState.Remove("VerifyPassword");
   ModelState.Clear();
   if (ModelState.IsValid)
   {
     db.Entry(user).State = EntityState.Modified;
     db.SaveChanges();
     return RedirectToAction("Index");
   }
}

这给了我 ModelState.IsValid = true 但无法更新。请给我解决这个问题。

提前致谢..

4

2 回答 2

3
  1. 您可以手动设置仅更新的字段并保存更改。

  2. 您可以先重置从数据库中获取的值。类似于以下内容(请原谅任何错误)

    var userFromDb = db.Users.Where(u => u.UserID == user.UserID).First();
    user.Password = person.Password;
    user.VerifyPassword = person.VerifyPassword;
    
    db.Entry(person).CurrentValues.SetValues(user);
    db.SaveChanges();
    
  3. 创建仅更新相关字段的自定义模型绑定器。

于 2013-06-09T11:14:42.357 回答
0

有几种方法可以解决您的问题(如用户 hutchonoid 在他的回答中所述)。我想最好的选择是不要将您的Useras 模型用于编辑视图,因为在这种情况下这显然不是它的目的。而是创建一个单独的UserEditModel类,其中包含您希望在编辑视图中拥有的所有用户属性,并像往常一样使用适当的验证属性对它们进行注释。然后在您的编辑视图中将模型表单更改UserUserEditModel. 在您的控制器中,您将拥有与以下代码类似的内容:

[HttpGet]
public ActionResult Edit(int userId)
{
    var user = db.Users.SingleOrDefault(u => u.UserID == userId);
    if user != null)
    {
        return View(UserUpdatModel.FromUser(user));
    }
    // do whatever you do to handle errors
}

[HttpPost]
public ActionResult Edit(UserUpdateModel user)
{
    if (ModelState.IsValid)
    {
        var userToUpdate = db.Users.SingleOrDefault(u => u.UserID == user.UserID);
        if (userToUpdate != null)
        {
            // update fields in userToUpdate with data from user
            db.SaveChanges();
        }
    }
    // do whatever you do to handle errors
}

为简单起见,我省略了一些代码(例如错误处理或UserEditModel- 它的属性和FromUser方法的内容,这些属性和方法将基于提供的实例创建自身的实例User)。希望有帮助。

于 2013-06-09T11:24:30.207 回答