MVC:控制器中的访问显示名称属性

时间:2013-01-13 23:03:20

标签: asp.net-mvc parameters

是否可以访问控制器中参数的显示名称?例如,假设我将参数定义为

public class Class1
{
  [DisplayName("First Name")]
  public string firstname { get; set; }
}

我现在希望能够在我的控制器中访问firstname的显示名称。像

这样的东西
string name = Model.Class1.firstName.getDisplayName();

是否有像getDisplayName()这样的方法可以用来获取显示名称?

3 个答案:

答案 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)

this link找到答案。我创建了一个Html帮助器类,将其命名空间添加到我的视图web.config并在我的控制器中使用它。所有内容都在link

中描述

答案 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();
    }