Asp.net mvc 如何使用自定义DataAnnotation来验证更复杂的数据类型? 介绍

Asp.net mvc 如何使用自定义DataAnnotation来验证更复杂的数据类型? 介绍,asp.net-mvc,validation,architecture,data-annotations,Asp.net Mvc,Validation,Architecture,Data Annotations,用[Required]和[MaxLength]装饰属性非常简单,效果非常好。它还附带客户端验证 然而,通常情况下,您的数据更为复杂。也许您需要检查数据库中是否存在某些内容,或者与外部服务通信以验证某些内容。您仍然需要验证,但标准的DataAnnotation还不够 实现这一点的一个好方法是使用自定义DataAnnotation。您可以创建自己的名为[UniqueEmailAttribute]的文件,用于检查数据库,查看电子邮件输入是否已经存在 问题 这就提出了一个架构问题。如果您使用这样的自定义

[Required]
[MaxLength]
装饰属性非常简单,效果非常好。它还附带客户端验证

然而,通常情况下,您的数据更为复杂。也许您需要检查数据库中是否存在某些内容,或者与外部服务通信以验证某些内容。您仍然需要验证,但标准的DataAnnotation还不够

实现这一点的一个好方法是使用自定义DataAnnotation。您可以创建自己的名为
[UniqueEmailAttribute]
的文件,用于检查数据库,查看电子邮件输入是否已经存在

问题 这就提出了一个架构问题。如果您使用这样的自定义数据注释,您如何支持关注点分离、依赖项注入等?在过去,我简单地创建了一个新的
DbContext
,实例化了所需的对象并完成了验证。这太难看了,打破了我的设计理念

什么是一个伟大的解决方案来验证表单数据,同时保持伟大的代码设计

我意识到这个问题以前似乎已经得到了回答,但请记住,我的问题不是“如何做到这一点?”而是“如何做好这一点?”或“什么是最佳实践?”这个问题是关于保持一致的解决方案/项目结构和设计的。代码示例可以是C#或VB.NET。欢迎链接到MVC4示例项目


我认为您可以编写一个自定义注释,将其挂接到jquery验证器中

然后,您可以使用它通过ajax调用控制器方法来进行验证

它仍然感觉有点像黑客(可能很脆弱),但似乎比在属性中包含逻辑和依赖项要好