含まれていない別のViewModelを確実に作成し、Password
それを編集ビューに送信してください。特定のニーズに対して特定の ViewModel を使用することは、まったく普通のことです。それがViewModelの目的です。軽量で再利用可能です。これらは、UI のニーズに合わせてエンティティ データを再形成し、必要なものだけを含めることを目的としています。これは、MVC パターンに反するのではなく、MVC パターンで機能するため、推奨される方法です。
必要に応じて、非機密データの ViewModel と、ユーザーのパスワードを変更する必要がある場合に非機密を継承する機密データ用の ViewModel を持つ継承階層を作成できます。そのような:
これを使用してユーザーを編集します。
public class UserEditViewModel {
public int ID { get; set; }
[Required]
public string Name { get; set; }
public string Surname { get; set; }
}
User
情報プラスが必要なときにご利用ください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
これにより、すべてのプロパティが 1 か所にあり、編集ではなく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);
}