6

我有以下基于 UIHInt 的属性:

[AttributeUsage(AttributeTargets.Property)]
public class DropDownListAttribute : UIHintAttribute, IMetadataAware
{
    public DropDownListAttribute(string selectListName)
        : base(KnownUiHints.DropDown, KnownPresentationLayers.Mvc, selectListName)
    {
        SelectListName = selectListName;
    }

    public string SelectListName { get; set; }

    public void OnMetadataCreated(ModelMetadata metadata)
    {
        metadata.AdditionalValues[KnowMetadataKeys.SelectListName] = SelectListName;
    }
}

其目的是将 SelectList 分配给要从列表中选择的单值视图模型属性,如下所示:

public class DemoModel: ViewModel
{
    [Required]
    [DropDownList("LanguageSelect")]
    [Display(Name = "Language")]
    public int? LanguageId { get; set; }

    public SelectList LanguageSelect { get; set; }
}

我现在与一些非常高尔伯式的机器和我自己的元数据提供者一起工作,但是发现IMetadataAware.OnMetadataCreated后,我觉得我可以简化它。现在我将 添加SelectListName到元数据中,然后跳过一些循环到 a) 将 SelectList 放入某种全局字典中,b) 在呈现下拉列表时从该字典中取出选择列表。

我想将 SelectList 本身添加到属性中的模型元数据中,即属性适用于属性的本地元数据,但是如何访问该属性或它包含类型?

4

1 回答 1

0

访问 Pocos 上的属性的示例代码。有单个或多属性版本可供查看

示例调用方法

var MutliAttributeList = MyStatic.GetPocoMultiAttribute<MyAttribute>(typeof(poco),"AttrName");


 public static UAttribute GetPocoAttribute<TPoco, UAttribute>(string attributeName) {
        var result = typeof (TPoco).GetCustomAttributes(true)
                                   .Where(attribute => attribute.GetType()
                                                                .Name == attributeName)
                                   .Cast<UAttribute>()
                                   .FirstOrDefault();
        return result;
    }

public static IEnumerable<UAttribute> GetPocoMultiAttribute<UAttribute>(Type pocoType, string attributeName) {
        var result = pocoType.GetCustomAttributes(true)
                             .Where(attribute => attribute.GetType()
                                                          .Name == attributeName).Cast<UAttribute>().ToList();
        return result;
    }
于 2013-05-19T14:15:26.463 回答