我是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,用户名因此我保持readonly也不想显示用户密码/验证密码字段所以我从视图中删除它。现在,在更新(编辑模式)时,我总是收到密码字段的验证错误消息。所以我的问题是如何避免更新这些字段并更新其他字段。为了解决这个问题,我尝试创建viewmodel,但它对我没有帮助。还在控制器中添加了绕过验证的代码:
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但无法更新。请给我解决这个问题。
提前致谢..
答案 0 :(得分:3)
您可以手动设置仅更新的字段并保存更改。
您可以先重置从数据库中获取的值。如下所示(请原谅任何错误)
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();
创建仅更新相关字段的自定义模型绑定器。
答案 1 :(得分:0)
有几种方法可以解决您的问题(正如用户hutchonoid在他的回答中所述)。我想最好的选择是不要将User
用作编辑视图的模型,因为在这种情况下它显然不是它的目的。而是创建一个单独的UserEditModel
类,其中包含您希望在编辑视图中拥有的所有用户属性,并使用适当的验证属性对其进行注释,就像您正常做的那样。然后,在您的修改视图中,将模型表单User
更改为UserEditModel
。在您的控制器中,您将拥有与以下代码类似的内容:
[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
创建自己的实例。希望有所帮助。