DataAnnotations MetadataType не работает - PullRequest
2 голосов
/ 14 января 2012

Я не могу присоединить MetadataType к автоматически сгенерированному классу в нашем приложении. Я протестировал установку атрибута Order в сгенерированном классе, и он работает нормально, но если попытаться использовать другой класс, я не смогу получить атрибуты позже.

Я также уже попробовал решение, предложенное здесь , но безуспешно.

Генерируемый класс

[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 ]

4 голосов
/ 17 января 2012

Убедитесь, что пространство имен, в котором определен ваш автоматически сгенерированный класс, совпадает с тем, в котором вы определили свой собственный частичный класс.Например:

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; }
    }
}
3 голосов
/ 13 марта 2012

Attribute.IsDefined (currentProp, typeof (DisplayAttribute)) по-прежнему False ЭТО ДОЛЖНО БЫТЬ ЛОЖНЫМ. Возможно, вы проверяете заказ с помощью специального кода! Ответ на вашу проблему очень прост: ваш пользовательский код просто НЕПРАВИЛЬНЫЙ. Возможно, это неправильно, потому что вы притворяетесь, что нашли атрибут, добавленный с классом метаданных, вместе со всеми другими «нативными» атрибутами этого класса. ЭТО НЕ ВЕРНО! .Net Clr НЕТ НАТУРАЛЬНОЙ ПОДДЕРЖКИ Атрибута MetaDataType! ЭТО ПРОСТО КОНВЕНЦИЯ. Вам решать, убедиться, что у вашего класса есть MetaDataType, и получить также атрибуты MetaDataType с тем же именем, что и у свойств вашего исходного класса. Я имею в виду, что вы должны сделать эту работу вручную. Все атрибуты, которые обработчик Mvc обрабатывает автоматически, обрабатываются таким образом ... то есть Mvc Engine просматривает атрибуты MetaDataType и объединяет их с собственными атрибутами ... Вы должны сделать то же самое в своем пользовательском коде.

Тем не менее, если вам нужен ваш атрибут в представлении ... вместо того, чтобы вручную извлекать ваши атрибуты, напишите пользовательский MetaDataProvider. Логика провайдера метаданных автоматически извлекает для вас все атрибуты (как я объяснил) ... вам нужно просто указать, какое действие предпринять для каждого из них.

...