是否可以访问控制器中参数的显示名称?例如,假设我将参数定义为
public class Class1
{
[DisplayName("First Name")]
public string firstname { get; set; }
}
我现在希望能够在我的控制器中访问firstname的显示名称。像
这样的东西string name = Model.Class1.firstName.getDisplayName();
是否有像getDisplayName()
这样的方法可以用来获取显示名称?
答案 0 :(得分:4)
首先,您需要获取表示该属性的MemberInfo对象。你需要做某种形式的反思:
MemberInfo property = typeof(Class1).GetProperty("Name");
(我正在使用“旧式”反射,但如果您在编译时可以访问该类型,也可以使用表达式树)
然后,您可以获取属性并获取DisplayName属性的值:
var attribute = property.GetCustomAttributes(typeof(DisplayNameAttribute), true)
.Cast<DisplayNameAttribute>().Single();
string displayName = attribute.DisplayName;
答案 1 :(得分:1)
答案 2 :(得分:0)
Enum的显示名称是这样的
这是示例
ConcurrentModificationException
和这样的方法
public enum Technology
{
[Display(Name = "AspNet Technology")]
AspNet,
[Display(Name = "Java Technology")]
Java,
[Display(Name = "PHP Technology")]
PHP,
}
你的控制器就像这样
public static string GetDisplayName(this Enum value)
{
var type = value.GetType();
var members = type.GetMember(value.ToString());
if (members.Length == 0) throw new ArgumentException(String.Format("error '{0}' not found in type '{1}'", value, type.Name));
var member = members[0];
var attributes = member.GetCustomAttributes(typeof(DisplayAttribute), false);
if (attributes.Length == 0) throw new ArgumentException(String.Format("'{0}.{1}' doesn't have DisplayAttribute", type.Name, value));
var attribute = (DisplayAttribute)attributes[0];
return attribute.GetName();
}
类属性的遵循此步骤
public ActionResult Index()
{
string DisplayName = Technology.AspNet.GetDisplayName();
return View();
}
并在控制器中调用此方法,如下所示
public static string GetDisplayName2<TSource, TProperty> (Expression<Func<TSource, TProperty>> expression)
{
var attribute = Attribute.GetCustomAttribute(((MemberExpression)expression.Body).Member, typeof(DisplayAttribute)) as DisplayAttribute;
return attribute.GetName();
}