在 IValidatableObject 上设置 ValidationContext 的 Items 集合?

Posted

技术标签:

【中文标题】在 IValidatableObject 上设置 ValidationContext 的 Items 集合?【英文标题】:Set Items collection of ValidationContext on IValidatableObject? 【发布时间】:2013-06-25 14:31:10 【问题描述】:

我有一个派生自 IValidateableObject 的视图模型类,并且我正在使用带有 ValidationContext 的 Validate 方法从我的控制器中对其进行评估。

我希望能够在 ObjectInstance 中测试更多的视图模型类本身的属性。我可能可以将这些东西添加到模型中,然后一切都会变得简单,但我不觉得这些东西真的属于视图模型类,因为它们更多的是关于该对象的当前状态。

我想知道 ValidationContext 中的 Items 集合是否是存储此类内容的合适位置...唯一的问题是我似乎找不到解释如何将内容添加到该字典的资源。

这有意义吗?任何人都可以解释如何在检查对象的 ModelState 之前填充 ValidationContext.Items 吗?

更新 #1 - 我在一篇关于 EF CTP5 () 的旧博客文章中找到了以下内容,但我不确定如何使用这些信息:

因此可以使用自定义验证逻辑,完全替代内置验证或过滤掉内置验证返回的一些验证错误。关于 DbContext.ValidateEntity(http://blogs.msdn.com/b/adonet/archive/2010/12/15/ef-feature-ctp5-validation.aspx) 方法的另一个小细节是该方法的第二个参数,如下所示:

IDictionary<object, object> items

默认情况下,它的值始终为空。然而压倒一切 DbContext.ValidateEntity() 允许将非空值传递给 this 方法调用:

return base.ValidateEntity(entityEntry, myItems);

更新 #2 - 我尝试使用自定义模型绑定器,但我也遇到了困难 - 似乎没有办法简单地将项目添加到 ValidationContext 然后调用base.OnModelUpdated(controllerContext, bindingContext) 方法。

【问题讨论】:

这似乎也与我想做的事情密切相关,但我无法将这些部分放在一起:***.com/questions/12918194/… 【参考方案1】:

如果您正在构建自己的模型验证器,请查看this question。如果这听起来工作量太大,不妨试试FluentValidation 项目,它可以让您向视图模型添加自定义验证规则并将它们存储在自己的类中。

【讨论】:

我真的只是想了解 ValidationContext 中的 Items 集合是如何使用的。在那个字典中有可以用来帮助我验证我的视图模型的对象是否有意义? 查看 FluentValidation 源,它是 MVC 的子类ModelValidatorProvider,它被添加到 global.asax 中的ModelValidatorProviders.Providers。它不使用任何 DbContext/EF 的东西,我可以通过谷歌搜索到一些关于 ModelMetadataProviderModelValidatorProvider 工作原理的文章。 感谢您的评论。我查看了 github 上的 FluentValidation 源代码。我仍然看不到在哪里可以影响传递给我的 IValidatableObject 的 ValidationContext 对象,尽管我确实看到了这段代码中使用 ModelValidatorProvider 的部分。 我不确定我是否可以再添加 - 你已经达到了我的理解极限。如果您确实取得了任何进展,请用您的发现更新此问题。

以上是关于在 IValidatableObject 上设置 ValidationContext 的 Items 集合?的主要内容,如果未能解决你的问题,请参考以下文章

如果在子级上验证失败,则不会在父级上调用IValidatableObject.Validate

如何使用 IValidatableObject?

如何在 IValidatableObject.Validate 方法的 ValidationContext 参数中提供 IServiceProvider

是否可以在 IValidatableObject 方法中以强类型的方式指定字段名称?

EF 代码优先:IValidatable 对象未验证

如何在 ASP.NET Core 中实现自定义模型验证?