使用ModelMetadata获取所有属性

时间:2013-03-06 10:33:36

标签: c# asp.net-mvc

我有一个从Web服务生成的部分类。我将ModelMetadata添加到此类中,如下所示:

// Automatically generated code

public partial class MyClass
{
    public string FIELD_ONE ...
    public DateTime? FIELD_TWO ...
}

// My code

[MetadataType(typeof(MyMetaDataClass))]
public partial class MyClass
{
}

public class MyMetaDataClass
{
    [Display(Name="Field One")] 
    public string FIELD_ONE;

    [Display(Name="Field Two")] 
    public DateTime? FIELD_TWO;
}

现在我想获得具有元数据显示属性的MyClass的所有属性,即FIELD_ONEFIELD_TWO

我尝试过像

这样的事情
typeof(MyClass).GetProperties().Where(p => Attribute.IsDefined(typeof(DisplayAttribute))

但当然属性不在MyClass的属性上。我也试过了:

ModelMetadata mmd = ModelMetadata.FromLambdaExpression(m => pi.GetValue(m, null), Html.ViewData);

但我收到错误“模板只能用于字段访问,属性访问,单维数组索引或单参数自定义索引器表达式。”

如果我可以从MyClass转到MyMetadataClass,我可以获取该属性的名称,并从MyClass获取相同名称的属性。

这可能吗,还是我在错误的树上狂奔?

1 个答案:

答案 0 :(得分:2)

你想要做的是什么?如果要覆盖默认元数据提供程序的功能,那么最好用您自己的实现替换DataAnnotationsModelMetadataProvider。以下是一些示例代码:

http://buildstarted.com/2010/09/14/creating-your-own-modelmetadataprovider-to-handle-custom-attributes/

在这里,作者正在添加对自己的自定义属性的支持,但您可以轻松覆盖DisplayAttribute的默认实现。

如果这没有帮助,请详细说明您要实现的目标。