Создание атрибутов UIHint на лету - PullRequest
2 голосов
/ 06 сентября 2011

Я хочу добавить атрибут UIHint в объект модели на лету.Я использовал ICustomTypeDescriptor для создания класса, который будет вставлять UIHint в экземпляр объекта:

public sealed class UIHintDescriptionProvider : TypeDescriptionProvider
{
    private string PropertyName;
    private string HintValue;

    public UIHintDescriptionProvider(TypeDescriptionProvider parent, string propertyName, string hintValue)
        : base(parent)
    {
        this.PropertyName = propertyName;
        this.HintValue = hintValue;
    }

    public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance)
    {
        return new UIHintDescriptor(base.GetTypeDescriptor(objectType, instance), this.PropertyName, this.HintValue);
    }
}

public sealed class UIHintDescriptor : CustomTypeDescriptor
{
    private string PropertyName;
    private string HintValue;

    internal UIHintDescriptor(ICustomTypeDescriptor parent, string propertyName, string hintValue)
        : base(parent)
    {
        this.PropertyName = propertyName;
        this.HintValue = hintValue;
    }

    public override PropertyDescriptorCollection GetProperties()
    {
        // Enumerate the original set of properties and create our new set with it
        PropertyDescriptorCollection originalProperties = base.GetProperties();
        List<PropertyDescriptor> newProperties = new List<PropertyDescriptor>();
        foreach (PropertyDescriptor pd in originalProperties)
        {
            if (pd.Name == this.PropertyName)
            {
                Attribute attr = new UIHintAttribute(this.HintValue);
                var newProp = TypeDescriptor.CreateProperty(typeof(object), pd, attr);
                newProperties.Add(newProp);
            }
            else
            {
                newProperties.Add(pd);
            }

        }

        // Finally return the list
        return new PropertyDescriptorCollection(newProperties.ToArray(), true);
    }

}

Затем я установил это в своем контроллере, используя:

UIHintDescriptionProvider provider =
                new UIHintDescriptionProvider(TypeDescriptor.GetProvider(typeof(PageContentItem)), "Text",
                                              "wysiwyg");
            TypeDescriptor.AddProvider(provider, item);

Inspectionв контроллере этого объекта с использованием функций TypeDescriptor указывают, что этот атрибут действительно установлен, однако он вообще не отображается на мой взгляд.При просмотре источника MVC3 отображаются все остальные атрибуты, кроме того, который я только что установил.

Выполняет ли MVC3 какое-либо кэширование описаний типов объектов в фоновом режиме, которое могло бы объяснить этот факт?

Любые другие предложения для вставки атрибута в экземпляр объекта во время выполнения?

1 Ответ

0 голосов
/ 25 июня 2012

Это, вероятно, из-за «времени». Попробуйте использовать пользовательский ModelMetadataProvider для программной установки атрибутов свойств модели, таких как UIHint, DisplayName или Посмотрите здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...