0

我已经阅读了很多解决方案,但我无法深入了解什么或何时使用 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; }
}

因此,在阅读此链接后如何在 ASP.NET MVC 3 中正确实现“确认密码”? . 我不知道他们为什么要替换User实体中已经存在的密码字段。我正在使用不显眼的客户端验证,因此如果我使用此模型视图,它确实可以工作。在我的视图中,我必须使用m=> m.User.Username但不是m=>m.Username,等等...因此,我的验证(例如比较密码)或只是远程验证不适用于我的视图中的名称,例如m=>m.User.Username. 我的思维结构或模型视图有什么问题?

4

1 回答 1

0

没有单一的规则,你需要保持务实,因为 ViewModel 和模型(或领域模型)是两个不同的东西。不,您不会通过放置不属于它们的属性来污染您的实体。这个想法是您的 UI 应该是可互换的,并且您的域不应该以任何方式依赖它。依赖关系应该倒置。也许明天您会将您的 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; }
}
于 2013-08-13T08:14:54.503 回答