如何找到UIHInt属性的target属性?

时间:2013-03-12 18:59:09

标签: entity-framework entity-framework-5 data-annotations asp.net-mvc-uihint

我有以下UIHInt基于attibute:

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

我现在正在使用一些很棒的Golbergian机器和我自己的元数据提供程序,但是在发现IMetadataAware.OnMetadataCreated后,我觉得我可以简化这一点。现在我将SelectListName添加到元数据中,然后跳过一些箍到a)将SelectList转换为一种全局字典,以及b)在呈现下拉列表时从该字典中获取选择列表。

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

1 个答案:

答案 0 :(得分: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;
    }