【问题标题】:Where do i place my viewmodel validation?我在哪里放置我的视图模型验证?
【发布时间】:2012-09-17 21:52:22
【问题描述】:

我们正在构建一个 ASP.Net MVC 应用程序,我们问自己一个问题,我们应该将传入数据的验证逻辑放在哪里。

我们已经进行了简单的验证:这些是视图模型上的属性,例如 [required], [numeric] , [email] 等(顺便说一句,这也可以讨论)

但是现在我们有更多的输入验证:我们想要验证从下拉列表中接收到的 id 是否是真实的 id。

例如:当我们收到 91 作为 countryid 时,我必须确保 91 是有效的 countryid 而不是用户“侵入”表单的值。因为如果不是有效的 countryid,我的数据层会产生错误。

  1. 我应该把它放在控制器操作方法中,因为那 当请求的数据到达时,方法知道什么是对的,什么是错的?

  2. 我应该把它放在一个 VacancyValidator 中(对象是一个 Vacancy 对象)我将所有与空缺相关的所有验证逻辑放在哪里 视图模型

  3. 我应该把它放在 ViewModel 中,因为它应该知道如何验证自己

  4. 我是否应该创建一个属性来验证我放置在 ViewModels 属性上的属性

  5. 我应该把它放在一个 Vacancy[thisviewmodelsname]Validator 中,我在其中放置了这个特定视图模型的所有验证逻辑

任何想法表示赞赏....

【问题讨论】:

    标签: asp.net-mvc validation architecture


    【解决方案1】:

    我们已经有了简单的验证:这些是属性 在视图模型上,如 [required]、[numeric]、[email] 等(这是 也开放讨论,顺便说一句)

    我会推荐 FluentValidation.NET 而不是使用 ASP.NET MVC 的 plays nicely 的数据注释。它提供了一种很好的语法来表达相互依赖的属性之间的复杂验证逻辑,而无需编写数百万行管道基础设施代码(如果您使用数据注释并编写自定义验证器,您必须这样做)并且还允许您 unit test your validation logic很容易。

    因为如果不是有效的 countryid,我的数据层会产生错误。

    你去 - 你的数据层已经为你处理了这个验证。但是如果你不想让它到达数据层,那么你可以在视图模型上为这个属性设置一个验证规则。如果您遵循我之前关于 FluentValidation.NET 的建议,您将已经知道将这条规则放在哪里 - 在您的视图模型的相应验证器中。

    【讨论】:

    • 在这种情况下,我不想让数据层处理它,但这是因为这个(自定义构建)数据层无法处理事务,所以我必须回滚所有其他插入/手动更新。我喜欢将验证放在视图模型中的想法。起初我认为验证是“业务逻辑”,您不应该将其与视图特定对象混合,但再次考虑它让我意识到它更像是一种净化操作而不是业务逻辑。
    • @Darin 有时开发人员不喜欢使用 FluentValidation.NET,因为它为项目添加了额外的依赖项。我没有看到使用数据注释的太多缺点,尽管我知道程序集不包含足够的验证属性,并且使用这种方法来实现某些验证并不复杂,但在这些情况下,我们仍然可以使用 IValidatableObject。 FluentValidation.NET 可能并不适合每个项目(尽管我喜欢那个模型),我可能会建议有人看一看,但不推荐他们而不是用户必须决定的数据注释。
    • @Mark,当然由用户决定。我所做的只是表达我的建议并将我的 2 美分投入到这个主题上。我推荐的东西并不意味着你应该使用它。这意味着我使用它。
    【解决方案2】:

    最好的方法是结合客户端和服务器验证。对于客户端验证,您可以使用jquery validation plugin。它提供所有标准验证模式(如 maxlength、minlength、required 等)。您可以在模型属性(数据注释)或直接在 html 中指定验证要求。此外,当验证结果将从服务器代码返回时,它提供了自定义remote 验证的可能性。

    但是您应该将客户端验证与服务器端重复。例如,使用 spring.net validation 。我认为它是最好的通用和灵活的框架。

    【讨论】:

      【解决方案3】:

      您将验证显然放到了视图模型中。这样,它就位于一个位置(不分散,因此是 DRY)并且可以在客户端和服务器上运行。

      希望这会有所帮助。

      【讨论】:

      • 我倾向于同意视图模型中的验证,但如果数据可以以两种形式编辑,我必须在两个不同的视图模型上验证相同的项目
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-10
      • 2021-05-29
      • 2011-03-02
      • 2016-05-08
      相关资源
      最近更新 更多