我能看出你的困境。我也在寻找其他验证解决方案,这些验证规则可能适用于给定模型对象上的多个属性,甚至对象图中不同模型对象的许多属性(如果您不幸验证链接对象)像这样)。
接口的限制IDataErrorInfo
是模型对象仅在没有属性有错误时满足有效状态。这就是说一个有效的对象是它的所有属性也是有效的。但是,我可能会遇到这样一种情况,如果属性 A、B 和 C 有效 - 那么整个对象都是有效的。而且如果属性 A 无效但 B和C 有效,那么该对象满足有效性。我根本无法用IDataErrorInfo
接口/DataAnnotations
属性来描述这个条件/规则。
所以我找到了这种委托方法。现在,在撰写本文时,MVC 中的许多有用的进步并不存在,但核心概念应该对您有所帮助。我们创建委托函数来验证更复杂的需求,而不是使用属性来定义对象的验证条件,并且因为它们是委托的,所以我们可以重用它们。当然它的工作量更大,但是使用委托意味着我们应该能够编写一次验证规则代码并将所有验证规则存储在一个地方(可能是服务层)和(kool 位)甚至使用 MVC 2DefaultModelBinder
来调用自动验证(无需大量检查我们的控制器操作 - 就像 Scott 的博客说我们可以使用DataAnnotations
. 参考“强类型 UI 助手”标题之前的最后一段)!
我相信您可以使用匿名委托(例如Func<T>
或)来加强上面文章中建议的方法,Predicate<T>
并为验证规则编写自定义代码块将启用跨属性条件(例如,如果您的ShippingSameAsBilling
属性在哪里,您提到的条件是true 那么你可以忽略更多关于送货地址等的规则)。
DataAnnotations
用于使对象的简单验证规则非常容易,只需很少的代码。但是随着您的需求的发展,您将需要验证更复杂的规则。MVC2 模型绑定器中的新虚拟方法应该继续为我们提供将我们未来的验证发明集成到 MVC 框架中的方法。