我现在遇到的问题是ASP.NET MVC验证了请求对象,在这种情况下 user
public ActionResult Edit(User user)
我想要做的是,如果用户的密码留空,请不要更新密码,只需使用旧密码,但如果已设置,请更新密码。
问题是该框架抱怨用户没有密码,即使我更新用户对象,它也会抱怨
public ActionResult Edit(User user)
{
user.Password = "Something";
// more code...
}
显然它对请求对象进行了验证,在这种情况下我是否可以跳过验证,或者至少延迟它直到我完成修改用户对象?
这是完整的方法代码
[HttpPost]
public ActionResult Edit(User user)
{
if (string.IsNullOrEmpty(user.Password))
{
var oldUser = db.Users.Single(u => u.Id == user.Id);
user.Password = oldUser.Password;
}
try
{
db.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View(user);
}
}
答案 0 :(得分:3)
即使将密码设置为某些内容,模型状态仍然无效。执行此操作后,尝试使用ModelState.Clear();
清除模型状态或相应地修改ModelState,即仅为密码属性ModelState.Remove("Password");
清除错误状态
[HttpPost]
public ActionResult Edit(User user)
{
if (string.IsNullOrEmpty(user.Password))
{
var oldUser = db.Users.Single(u => u.Id == user.Id);
user.Password = oldUser.Password;
ModelState.Clear(); // or change the state accordingly (ModelState.Remove("Password");)
}
.......
}
在您的帖子中,您似乎知道密码字段中的[Required]
属性。我建议您强制进行javascript验证,并让用户知道他们无法将密码更新为空白。或者,如果要以不包含密码的形式更新用户信息,请创建一个没有密码字段的新视图模型或临时模型,并且该模型特定于该表单。发布到此模型并绑定到此模型。然后使用临时用户模型中的数据更新实际用户模型。这将是更好的实践。
答案 1 :(得分:0)
这里的问题与服务器无关,它是客户端。我假设您在Required
属性上有Password
属性,因此当MVC为模型生成视图时,它会自动生成客户端验证AKA Unobtrusive validation。
您可以编写自己的自定义属性来处理您的特定场景,但这意味着您还需要编写自己的客户端验证。这里的简单修复是删除Required
属性并在服务器端处理验证。
我想要做的是,如果用户的密码留空,请不要更新密码,只需使用旧密码,但如果已设置,请更新密码。
如果是这种情况那么你的逻辑实际上是错误的。您不应该在Required
上拥有Password
属性,因为您的规则规定可以为空。