总之,我正在尝试基于数据库字段在运行时创建特定于实例的数据注释属性。我现在所拥有的可以很好地创建初始模型,但是当模型被回发并且服务器验证发生时就会失败。
(我在视图模型中的集合中使用了相同的输入模型,但是必须对集合中的每个实例应用不同的验证......例如,输入的第一次出现可能被限制在 1-100 的范围内但在同一输入页面上提示的同一模型的下一次出现将是 1000-2000 的范围。另一个可能是日期,或者必须是 6 个字符长的字符串......)
我将解释我做了什么以及我的问题在哪里:
我继承DataAnnotationsModelMetadataProvider
并提供了我自己的实现GetMetadataForProperty
(这与验证问题没有任何关系......但是)
我继承DataAnnotationsModelValidatorProvider
并提供了GetValidators
. 我在这里要做的是根据我的数据库记录创建新属性,然后将这些属性传递给基本实现,以便相应地创建验证器。
但是...... GetValidators
在 PROPERTY 级别调用......当使用我想要应用验证器的属性名调用它时,我需要找到该属性名的适用数据库记录,以便找出哪些属性我需要创建....但是...我无法仅从值字段的属性名中获取数据库记录的键......事实上,数据库键在父模型中......那我要怎么把握呢?!
我尝试使用静态变量(YUK)并在调用一个属性期间存储密钥,并在另一次调用我的值字段属性期间检索它......但是因为模型是单向序列化的,反序列化是相反的最终我的密钥与我所需的属性不同步。
为了增加一点复杂性,我还使用了自定义模型绑定器。我已经按照此处其他地方的建议覆盖了 CreateModel ,但是我找不到将元数据或附加值附加到我的输出模型的属性的方法....仅适用于模型本身....但是我该怎么做GetValidators 中的 MODEL 元数据/附加值需要一个 PROPERTY 吗?
所以......我的问题是双重的......
1) 谁能帮我从我的自定义模型绑定器中获取我的数据库密钥到我的 ValidationProvider 上的 GetValidators 方法?或者也许使用我的自定义元数据提供程序?
2) 是否有一种不同的、更简单的方法可以在运行时根据数据库记录创建验证器?