绝对创建一个不包含的单独 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; }
}
当您需要User
info 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
,而不是编辑Name
,Surname
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);
}