DataAnnotations MetadataType无效

时间:2012-01-14 01:41:58

标签: wpf asp.net-mvc attributes data-annotations metadatatype

我无法在我们的应用程序中将MetadataType附加到自动生成的类。 我测试了在生成的类中设置Order属性,它工作正常,但如果尝试使用另一个类,我以后无法获取属性。

我也尝试过建议here的解决方案但没有成功。

生成的课程

[Table(Name = "T_MKT_Product")]
public partial class T_MKT_Product : GlobalSist.DataAccess.Base.BaseEntity
{
    [Column(Storage = "_code", DbType = "varchar(20)", IsUnique = true)]
    public virtual string Code
    {
        get { return _code; }
        set
        {
            if (_code != value)
            {
                OnPropertyChanging("Code");
                _code = value;
                OnPropertyChanged("Code");
            }
        }
    }

    [Column(Storage = "_name", DbType = "varchar(200)")]
    public virtual string Name
    {
        get { return _name; }
        set
        {
            if (_name != value)
            {
                OnPropertyChanging("Name");
                _name = value;
                OnPropertyChanged("Name");
            }
        }
    }

    [Column(Storage = "_description", DbType = "varchar(200)", CanBeNull = true)]
    public virtual string Description
    {
        get { return _description; }
        set
        {
            if (_description != value)
            {
                OnPropertyChanging("Description");
                _description = value;
                OnPropertyChanged("Description");
            }
        }
    }
}

然后我定义了以下类

[MetadataType(typeof(ProductMetaData))]
public partial class T_MKT_Product
{
}

public class ProductMetaData
{
    [Display(Order = -1)]
    public virtual string Code { get; set; }

    [Display(Order = -2)]
    public object Name { get; set; }

    [Display(Order = -3)]
    public object Description { get; set; }
}

帮助! :)

2 个答案:

答案 0 :(得分:4)

确保定义的自动生成类的名称空间与您定义自定义分部类的名称空间相同。例如:

namespace FooBar
{
    [Table(Name = "T_MKT_Product")]
    public partial class T_MKT_Product : GlobalSist.DataAccess.Base.BaseEntity
    {
        ...
    }
}

和你的:

namespace FooBar
{
    [MetadataType(typeof(ProductMetaData))]
    public partial class T_MKT_Product
    {
    }

    public class ProductMetaData
    {
        [Display(Order = -1)]
        public virtual string Code { get; set; }

        [Display(Order = -2)]
        public object Name { get; set; }

        [Display(Order = -3)]
        public object Description { get; set; }
    }
}

答案 1 :(得分:3)

Attribute.IsDefined(currentProp,typeof(DisplayAttribute))仍为False 它必须是错误的。您可能正在使用自定义代码检查订单!您的问题的答案非常简单:您的自定义代码简直错误。可能这是错误的,因为你假装找到了与methadata类一起添加的属性以及该类的所有其他“本机”属性。这是错的! .Net Clr对MetaDataType属性没有任何本地支持!这只是一项公约。由您自己决定,您的类具有MetaDataType,并检索MetaDataType的属性,其属性与原始类的属性相同。 我认为你必须手动完成这项工作。 Mvc引擎自动处理的所有属性都以这种方式处理......即Mvc引擎查看MetaDataType的属性并将它们与本机属性合并......您必须在自定义代码中执行相同操作。

如果您需要在视图中使用属性...而不是手动检索属性,请编写自定义MetaDataProvider。元数据提供程序逻辑会自动为您检索所有属性(我解释的方式)...您只需指定对每个属性采取的操作。