1

我想允许我的用户更新他们的帐户详细信息。为简化起见,假设帐户模型由IDNameSurnameUsername和组成Password,并且我只希望用户能够更改NameSurname。问题是,如果我将帐户模型传递给视图,我需要为IDUsernamePassword. 现在即使我可以加密这些数据,将密码放在视图中也不安全。

另一种方法是创建一个EditAccount包含ID, Nameand Surnameonly 的视图模型,但是在控制器操作中我需要再次搜索正在修改的用户NameSurname在保存之前手动分配新的用户,这种方法不是特别整洁. 在这种情况下,您有什么建议吗?

4

1 回答 1

2

绝对创建一个不包含的单独 ViewModelPassword并将其发送到编辑视图。为特定需求使用特定的 ViewModel 是完全正常的。这就是 ViewModel 的用途。它们重量轻且可重复使用。它们旨在重塑您的实体数据以满足 UI 的需求,以仅包含您需要的内容。这是首选方法,因为它适用于 MVC 模式,而不是反对它。

如果需要,您可以创建一个继承层次结构,例如具有一个非敏感数据 ViewModel 和一个用于继承非敏感数据的敏感数据,以满足更改用户密码的需要。如:

使用它来编辑用户:

public class UserEditViewModel {

    public int ID { get; set; }

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

    public string Surname { get; set; }
}

当您需要Userinfo plus时使用它Password。当您希望允许用户编辑其密码时使用此模型

public class SensitiveUserViewModel : UserEditViewModel {

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

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Current Password")]
    public string OldPassword { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "New Password")]
    public string NewPassword { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm New Password")]
    [Compare("NewPassword", ErrorMessage = "The new password and confirmation password do not match")]
    public string ConfirmPassword { get; set; }
}

您进行编辑的视图将具有这些操作。通过这种方式编辑非敏感用户信息只有您需要的数据,并且没有安全问题。

public ActionResult EditUser(int ID) {
    // get User by ID
    var model = new UserEditViewModel();
    // map your entity fields to ViewModel
    return View(model);
}

public ActionResult EditUser(UserEditViewModel model) {
    if(ModelState.IsValid) {
        // save user edits
    }
    return View(model);
}

您应该使用单独的视图来允许用户编辑密码信息。这样您就可以使用,SensitiveUserViewModel因此您拥有所有数据,敏感和非敏感属性。这样可以保持一切干净,因为您的所有属性都在一个地方,并且仅用于更改Password,而不是编辑NameSurname

public ActionResult ChangePassword(int ID) {
    // get user by ID
    var model = new SensitiveUserViewModel();
    // map your entity to ViewModel
    return View(model);
}

[HttpPost]
public ActionResult ChangePassword(SensitiveUserViewModel model) {
    if(ModelState.IsValid) {
        // save user password info
    }
    return View(model);
}
于 2012-06-10T15:07:25.810 回答