我已经阅读了许多解决方案,但我无法深入了解使用View Model的内容或时间?
例如,当我有一个注册表单供用户注册时,我想要一个字段Confirm Password
,但我认为不应该将它添加到User
实体中。所以我有这个ViewModel:
public class RegisterViewModel
{
public User User { get; set; }
public IEnumerable<SelectListItem> City { get; set; }
public IEnumerable<SelectListItem> Ward { get; set; }
[Required(ErrorMessage = "Bạn chưa nhập lại mật khẩu.")]
[StringLength(100, ErrorMessage = "Mật khẩu phải có ít nhất {2} ký tự.", MinimumLength = 6)]
[DataType(DataType.Password)]
[System.Web.Mvc.Compare("User.Password", ErrorMessage = "Mật khẩu không khớp.")]
public string ConfimPass { get; set; }
}
所以阅读此链接后How to properly implement "Confirm Password" in ASP.NET MVC 3?。我不知道为什么他们应该替换已经在User
实体中的密码字段。我正在使用不引人注目的客户端验证,所以如果我使用这个模型视图它确实有效。在我的视图中,我必须使用m=> m.User.Username
但不能使用m=>m.Username
等等...因此,我的验证(例如比较密码或仅远程验证)与我的视图中的名称不一样{ {1}}。在我的思考中,我的结构或模型视图出了什么问题?
答案 0 :(得分:0)
没有单一的规则,你需要保持务实,只要说ViewModel和模型(或域模型)是两个不同的东西。不,您不会通过放置不属于他们的属性来污染您的实体。我们的想法是,您的用户界面应该是可以互换的,您的域名不应该以任何方式依赖它。应该反转依赖关系。也许明天你将UI层切换(或扩展)到WPF(例如)?您当前的ViewModel(及其属性)在哪些方面没有多大意义。 在您的情况下,是的,您应该创建一个视图模型并保持与视图相关的所有内容,然后将值映射/传递回您的域模型。 我希望我有意义,如果你需要澄清,请告诉我。
在您的情况下,我可能会创建一个扁平的RegisterViewModel
,其中只包含注册用户所需的信息,例如:
public class RegisterViewModel
{
[Required]
public string DisplayName { get; set; }
[Required]
public string FirstName { get; set; }
// etc ...
public IEnumerable<SelectListItem> City { get; set; }
public IEnumerable<SelectListItem> Ward { get; set; }
[Required(ErrorMessage = "Bạn chưa nhập lại mật khẩu.")]
[StringLength(100, ErrorMessage = "Mật khẩu phải có ít nhất {2} ký tự.", MinimumLength = 6)]
[DataType(DataType.Password)]
[System.Web.Mvc.Compare("User.Password", ErrorMessage = "Mật khẩu không khớp.")]
public string ConfimPass { get; set; }
}