首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >ASP.NET MVC体系结构:通过组合,继承或重复来实现ViewModel?

ASP.NET MVC体系结构:通过组合,继承或重复来实现ViewModel?
EN

Stack Overflow用户
提问于 2018-03-26 01:08:42
回答 2查看 0关注 0票数 0

我使用ASP.NET MVC 3和实体框架4.1代码优先。

假设我有一个User实体:

public class User
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }        
}

在我编辑它时我UserController想添加一个PasswordConfirmation字段并验证PasswordConfirmation == Password

1.通过组合

我的第一次尝试是:

public class EditUserModel
{
    [Required]
    public User User { get; set; }

    [Compare("User.Password", ErrorMessage = "Passwords don't match.")]
    public string PasswordConfirmation { get; set; }
}

在这种情况下,客户端验证 (客户端验证工作是巧合。)不起作用,并且服务器端验证失败,并显示以下消息:无法找到名为User.Password的属性

我认为最好的解决方案,在这种情况下,将创建一个自定义 CompareAttribute

实施 IValidatableObject

public class EditUserModel : IValidatableObject
{
    [Required]
    public User User { get; set; }
    public string PasswordConfirmation { get; set; }

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
    {
        if(this.PasswordConfirmation != this.User.Password)
            return new[] { new ValidationResult("Passwords don't match", new[] { "PasswordConfirmation " }) };

        return new ValidationResult[0];
    }
}

在这种情况下,服务器端验证有效,客户端验证不再起作用。实现IClientValidatable看起来有点太复杂,我更喜欢在这种情况下没有客户端验证。

2.通过继承

public class EditUserModel : User
{
    [Compare("Password", ErrorMessage = "Passwords don't match.")]
    public string PasswordConfirmation  { get; set; }
}

当试图直接保存EditUserModel使用EF它不工作,我得到一些一些错误信息有关的EditUserModel元数据,以便我使用AutoMapper要转换UserEditUserModel和倒退。此解决方案的工作原理,但它更复杂,因为我必须从模型转换到视图模型和向后。

3.通过重复

(由Malte Clasen推荐)

视图模型将具有模型的所有属性和附加属性。AutoMapper可以用来从一个转换到另一个。

public class EditUserModel {    
  public string Name { get; set; }    
  public string Email { get; set; }    
  public string Password { get; set; }   
  [Compare("Password", ErrorMessage = "Passwords don't match.")]     
  public string ConfirmPassword { get; set; }        
}

这是我最不喜欢的解决方案,因为代码重复(DRY)

问题

在这种情况下继承,组成和重复有什么优点和缺点?

有没有一种简单的方法来同时进行客户端和服务器端验证,而无需将模型转换为视图模型和向后?

EN

Stack Overflow用户

发布于 2018-03-26 10:31:10

例如,在这种情况下,也可以考虑用于域和视图模型的独立类

public class EditUserModel {    
  public string Name { get; set; }    
  public string Email { get; set; }    
  public string Password { get; set; }        
  public string ConfirmPassword { get; set; }        
}

如果Id存储在URL中。如果你想避免User和EditorUserModel实例之间的手动拷贝,AutoMapper可以为你提供帮助。这样,可以轻松地将视图模型中的密码字符串与域模型中的密码哈希解耦合。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档