gpt4 book ai didi

c# - 如何扩展 DataAnnotations ModelMetadata

转载 作者:行者123 更新时间:2023-11-30 17:05:21 25 4
gpt4 key购买 nike

我有一个自定义的 DataAnnotationsModelMetadataProvider,我想返回一个从 ModelMetadata 派生的对象,这样我就可以在我的 razor 模板中拥有额外的属性。

到目前为止,我的自定义提供程序仅重写了 CreateMetadata 函数:

protected override ModelMetadata CreateMetadata(IEnumerable<Attribute> attributes, Type containerType, Func<object> modelAccessor, Type modelType, string propertyName)
{
var modelMetadata = base.CreateMetadata(attributes, containerType, modelAccessor, modelType, propertyName);

ModelMetadataAttribute mma;
foreach (Attribute a in attributes)
{
mma = a as ModelMetadataAttribute;
if (mma != null)
mma.Process(modelMetadata);
}

return modelMetadata;
}

这样从 ModelMetadataAttribute 派生的每个属性都可以执行一些自定义操作(实际上它只添加 AdditionalValues)

但是由于我几乎所有的属性主要是将属性添加到我在 razor 模板中生成的 html 元素,我希望 View 中的 ModelMetadata 包含我想要的属性的字典添加(和其他一些东西)。

所以我需要一个继承自 DataAnnotationsModelMetadata 的类。

我不能只调用 base.CreateMetadata 函数,因为它不能正确转换到我的派生类。

我考虑过将 base.CreateMetadata 函数返回的 DataAnnotationsModelMetadata 的公共(public)属性复制到我的派生类中,但我可以丢失信息,所以它不会看起来很安全。

我想到的另一种方法是复制/粘贴 CreateMetadata 的基本代码并添加我的逻辑,但它看起来很难看......(而且我只有 mvc3 源,所以它可能有在 mvc4 中改变了)

还考虑从 ViewDataDictionnary 继承,以便我可以提供自定义元数据类而不是标准元数据类,但我不知道如何执行此操作。 (我也承认我在那个特定问题上没有深入挖掘)

我看了很多关于 DataAnnotations 和提供者的文章,但找不到与我正在尝试做的类似的东西。

那么我的选择是什么?我可以朝哪个方向搜索以更接近我想做的事情?

编辑:

我看了这个问题(很相似):Can I achieve a 'copy constructor' in C# that copies from a derived class?但它所做的是属性的副本,我想避免这种情况。在这篇文章的最后一个答案中,有一些关于 PopulateMetadata 的内容,但我在基本提供程序中找不到该功能...

最佳答案

我建议你看一下MvcExtensions:http://mvcextensions.github.io/

它的主要部分之一就是您正在做的事情 - 广泛的模型元数据配置/使用。您可能会在那里找到很多答案,或者只是将其作为“随时可用”的解决方案。

关于c# - 如何扩展 DataAnnotations ModelMetadata,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16627312/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com