【问题标题】:Where to put data management rules for complex data validation in ASP.NET MVC?ASP.NET MVC 中复杂数据验证的数据管理规则放在哪里?
【发布时间】:2011-02-22 08:01:35
【问题描述】:

我目前正在开发一个 ASP.NET MVC2 项目。这是我第一次开发真正的 MVC Web 应用程序。 ASP.NET MVC website 确实帮助我快速入门,但我仍然对数据模型验证有一些晦涩的了解。

我的问题是,当涉及到复杂的验证规则时,我真的不知道在哪里管理我的填充数据模型。例如,使用 Regex 验证字符串字段非常容易,而且我知道我只需要用特定属性装饰我的字段,因此在模型中实现了数据管理规则。但是,如果我有多个需要相互验证的字段,例如需要按照特定时间规则正确设置的多个日期时间,我需要在哪里验证它们?我知道我可以创建自己的验证属性,但有时验证会询问一个特定的验证路径,该路径很复杂,无法使用属性进行验证。

第一个问题也让我想到了一个相关的问题,即在控制器中验证模型是否正确?因为目前这是我找到进行复杂验证的唯一方法。但我觉得这有点脏,而且我觉得它不适合控制器角色并且更难测试(多代码路径)。

谢谢。

注意:我在这里得到了一些非常好的解决方案,但我正在等待其他想法和一些“最佳实践”解决方案。

【问题讨论】:

  • 我也在问自己同样的问题。尝试尽可能“干燥”,我应该如何处理简单的验证(必需、格式等)?我应该使用 DataAnnotation 在视图中强制执行它并在我的业务层中重做相同的验证(加上更复杂的验证)吗?

标签: asp.net asp.net-mvc validation data-management


【解决方案1】:

超级骗子。超级主观。“在哪里以及如何使用 MVC 进行验证”的论点已被打死,没有给出一个直接的答案。这对每个开发人员/商店来说都是如此主观和哲学,以至于每个人几乎不可能就任何事情达成一致。

另一个问题是,甚至验证工具也有多种形状和大小,并且可以在不同的范围和层中发挥作用。验证工具的多样性几乎是疯狂的。 if( someString !="" ) 怎么变得这么难? ;)

如果您阅读这些其他答案,您很快就会发现根本没有最佳实践。一旦你进入领域驱动设计原则和关于无效状态和对象的讨论,你会发现讨论变得更加复杂。

Where do you do your validation? model, controller or view

ASP.NET MVC 2 validation using DTOs instead of domain entities

Does ASP.Net MVC 2 validation need some more thought in terms of patterns and use?

Mapping Validation Attributes From Domain Entity to DTO

Which validation library for ASP.NET MVC?

ASP.NET MVC - User Input and Service/Repository - Where to do Validation?

ASP.NET MVC: Is Data Annotation Validation Enough?

MVC - where to implement form validation (server-side)?

Asp.Net MVC Validation

DDD:

Validation in a Domain Driven Design

【讨论】:

  • @R0MANARMY 我明白了很多;我怎么总是听起来很生气?我真的不是。 :(
  • 我只是在开玩笑,不要太个人化
  • 感谢所有这些链接。所以我打赌这都是关于练习的。作为一名初级开发人员,我习惯于在开始使用新技术时寻找最佳实践。
【解决方案2】:

我个人的意见是保持视图尽可能干净,并尝试强制视图仅显示数据(尽可能保持视图愚蠢)。

当然,您可以在视图中进行一些简单的验证,例如Required、Regex 规则等。

复杂的业务规则应该位于业务实体或某些业务逻辑层内。

我在 MVC 项目中所做的是让模型调用诸如 Validate() 之类的方法,该方法将检查最终级别的验证,例如业务规则等,然后我可以调用 Save();

【讨论】:

  • 我相信我可以很容易地扩展我的部分 LinqToSql 模型部分类。谢谢。
【解决方案3】:

一旦你有一个准备好验证的填充类,只需将它传递给控制器​​中的验证类。

【讨论】:

  • 我非常喜欢这个想法。它记得我在默认帐户控制器中使用的设计。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2011-09-27
  • 2011-02-02
  • 2020-09-06
  • 1970-01-01
  • 2015-07-06
相关资源
最近更新 更多