C#MVC通过反射获取具有ResourceType参数的Display属性的值

时间:2018-04-03 11:02:12

标签: c# asp.net-mvc razor reflection

我有一个“通用”Razor视图,用于显示模型的表格,该模型是IEnumerable<IFirstLevetOverviewModel>之类的集合。在这个视图中,我循环访问集合中的所有项目并通过反射显示列和标题。所以为了构建标题我正在使用这段代码:

模型属性:

 [Display(Name = "Personalkategorie_OffiziellerStellenplan"]
 public string PersonalNumber { get; set; }

查看:

 @foreach (var prop in Model.FirstOrDefault().GetType().GetProperties())
            {
                if (!prop.PropertyType.Name.Contains("IEnumerable"))
                {
                    <th style="width: calc(100%/@propsCount);">
                      @DisplayNameReflected(prop);
                    </th>
                }
            }

助手:

 @helper DisplayNameReflected(PropertyInfo property)
 {
        if (!property.PropertyType.Name.Contains("IEnumerable"))
        {
            var dd = property.GetCustomAttribute(typeof(DisplayAttribute)) as DisplayAttribute;
            if (dd != null)
            {
                var name = dd.Name;
            }
        }
}

它工作正常。但是现在我需要实现本地化,所以我需要使用ResourceType ([Display(Name = "Personalkategorie_OffiziellerStellenplan", ResourceType = typeof(Labels))])。 但我无法弄清楚如何改进我的助手以获得本地化名称。有可能吗?或者也许有一些更清洁的方法来做它?

1 个答案:

答案 0 :(得分:0)

可以通过ResourceManage完成:

@helper DisplayNameReflected(PropertyInfo property, ResourceManager resManager)
    {
        if (!property.PropertyType.Name.Contains("IEnumerable"))
        {
            var dd = property.GetCustomAttribute(typeof(DisplayAttribute)) as DisplayAttribute;
            if (dd != null)
            {
                <p>
                    @resManager.GetString(dd.Name, CultureInfo.CurrentCulture)
                </p>
            }
        }
}