【问题标题】:ASP.NET MVC - Validation logic - where to place?ASP.NET MVC - 验证逻辑 - 放在哪里?
【发布时间】:2010-12-18 21:06:02
【问题描述】:

我正在尝试确定放置“验证模型”的位置。

我现在的结构是:

Web(参考业务和对象)

  • 控制器

  • 观看次数

  • CSS

  • 脚本

业务(引用数据和对象)

  • 服务

数据(引用对象)

  • 存储库和 EF 上下文(代码优先)

对象

  • POCO(用于 EF)

现在我的问题是在哪里放置诸如登录模型之类的验证内容?模型应该放在我的 Web 层还是对象层? - 或者我什至应该存储这样的验证模型?

提前致谢!

【问题讨论】:

    标签: c# asp.net-mvc validation


    【解决方案1】:

    模型应该放置在您的业务层中。视图模型应该放置在您的 Web 层中,因为它们与视图相关联。你的模型和视图模型之间应该有一个映射(为了方便这个任务,你可以使用像AutoMapper 这样的工具)。视图从控制器接收视图模型。在这些视图模型上执行验证。

    所以:

    网络

    • 控制器
    • 观看次数
    • 模型(您可以在这里放置视图模型)
    • CSS
    • 脚本

    【讨论】:

    • 所以如果我有一个登录模型 - 那么我必须在我的业务中放置一个名为“LogInModel”的模型,它根本没有任何验证属性。然后在 Web 层中创建一个“ViewModel” " 将验证规则应用于 LogInModel?
    【解决方案2】:

    任何需要验证的内容都应该放在您的业务层中。验证是一个业务问题,不应分散在各个层中,也不应与特定的应用程序类型(Web、Windows、服务等)相关联。

    如果您将域模型暴露给应用程序,那么您也可以使用验证属性来装饰您的实体,但请注意,如果您的域模型发生更改,那么您的应用程序就会中断。

    假设您在业务层中有一个AccountService 类,它有一个Login 方法。 Login 接受 LoginInput 类并返回 LoginResult 类:

    public class LoginInput {
    
       [Required]
       public string Username { get; set; }
    
       [Required]
       public string Password { get; set; }
    } 
    
    public class LoginResult {
       public bool Success { get; internal set; }
       public string Error { get; internal set; }
    }
    

    这两个类都可以用作 ViewModel,因此您无需在 Web 层创建任何 ViewModel,当然也不应在其中放入验证逻辑。

    【讨论】: