2011-09-06 80 views
2

我想動態注入一個UIHint屬性到模型對象中。我一直在使用ICustomTypeDescriptor創建一個類,將注入UIHint到對象的實例:即時創建UIHint屬性

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

檢驗中的控制器:

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); 
    } 

} 

我然後使用設置這在我的控制器這個使用TypeDescriptor函數的對象表明這個屬性確實已經設置好了,但是它根本不出現在我的視圖中。瀏覽MVC3源代碼會顯示所有其他屬性,但不是我剛剛設置的屬性。

MVC3是否可以在後臺對對象類型描述進行任何緩存來解釋這一事實?

任何其他建議在運行時注入屬性到對象實例?

回答

0

這可能是因爲'時間'。 嘗試使用自定義ModelMetadataProvider以編程方式設置模型屬性屬性,如「UIHint」或「DisplayName」或... 看看here