0

我现在遇到的问题是 ASP.NET MVC 验证请求对象,在这种情况下是用户

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

2 回答 2

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 验证并让用户知道他们无法将密码更新为空白。或者,如果您在不包含密码的表单中更新用户信息,请创建一个没有密码字段的新视图模型或临时模型,并且该模型特定于该表单。发布到这个模型并绑定到这个模型。然后使用临时用户模型中的数据更新实际用户模型。这将是更好的做法。

于 2012-10-09T14:47:42.353 回答
0

这里的问题与服务器无关,它是客户端。我假设您在Required属性上有一个属性,Password因此当 MVC 为模型生成视图时,它会自动生成客户端验证 AKA Unobtrusive validation

您可以编写自己的自定义属性来处理您的特定场景,但是,这意味着您还需要编写自己的客户端验证。这里的简单修复是删除Required属性并在服务器端处理验证。

我想要做的是,如果用户的密码留空,不要更新密码,只需使用旧密码,但如果已设置,请更新它。

如果是这种情况,那么您的逻辑实际上是错误的。您不应该在 上具有该Required属性,Password因为您的规则规定它可以为空。

于 2012-10-09T14:47:55.483 回答