C# 在运行时/注册ClientValidatorCache实现时更改验证定义

C# 在运行时/注册ClientValidatorCache实现时更改验证定义,c#,validation,asp.net-core,unobtrusive-validation,C#,Validation,Asp.net Core,Unobtrusive Validation,目标: 我想在运行时更改验证定义。例如:根据需要标记属性 模型元数据提供程序: 您必须绕过DefaultModelMetaProvider的缓存机制,如下所述: =>完美,服务器端验证有效(您可以重新定义ValidationMetadata.IsRequired标志) 但是,等等,客户机验证是怎么回事(从不可信的验证中呈现的属性,如所需的数据…)?它也被ClientValidatorCache实现缓存。(此类没有虚拟方法或定义的接口) 因此,我创建了一个从DefaultValidationHt

目标: 我想在运行时更改验证定义。例如:根据需要标记属性

模型元数据提供程序:

您必须绕过DefaultModelMetaProvider的缓存机制,如下所述:

=>完美,服务器端验证有效(您可以重新定义ValidationMetadata.IsRequired标志)

但是,等等,客户机验证是怎么回事(从不可信的验证中呈现的属性,如所需的数据…)?它也被ClientValidatorCache实现缓存。(此类没有虚拟方法或定义的接口)

因此,我创建了一个从DefaultValidationHtmlAttributeProvider继承的类,并重写了AddValidationAttributes方法。新实现使用不尊重缓存的实现调用my CustomClientValidatorCache

这是非常丑陋的,必须有一个更好的方法来实现这一点

最后的问题是:

->如何为ClientValidatorCache注册自己的实现

还是有更好的方法来实现我的目标


(我创建了一个测试回购协议,您可以在其中看到我当前糟糕的“解决方案”):


参考文献:

(编辑:添加引用)


另一种尝试:

创建ClientModelValidatorProvider(IClientModelValidatorProvider)并将IsReusable设置为false

结果:


只有当您从初始现有验证器更改ValidationMetaData时,它才起作用。因为ClientValidatorCache将返回缓存的初始结果;)

在验证过程中不会更改值。该机制也不支持这一点。如果您有依赖验证,请使用例如FluentValidation来处理复杂的规则。