我应该为ASP MVC项目中的每个实体使用每个ViewModel吗?

时间:2013-08-13 08:08:00

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

我已经阅读了许多解决方案,但我无法深入了解使用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}}。在我的思考中,我的结构或模型视图出了什么问题?

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; }
}