验证前ASP.NET MVC 3更新字段

时间:2012-10-09 14:21:45

标签: asp.net-mvc asp.net-mvc-3

我现在遇到的问题是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);
    }
}

2 个答案:

答案 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属性,因为您的规则规定可以为空。