Asp.net mvc 2 从MCV2视图中的模型集合中读取数据注释

Asp.net mvc 2 从MCV2视图中的模型集合中读取数据注释,asp.net-mvc-2,views,data-annotations,Asp.net Mvc 2,Views,Data Annotations,在我的MVC2管理员区域中,我想为我的每个域模型创建一个概览表。 我对这些域模型对象的属性使用如下数据注释: [DisplayName("MyPropertyName")] public string Name { get; set; } 现在我的问题是:如果我的视图接收到我的域模型集合,我如何访问DisplayName属性?我需要它来构建表头,这些表头是在通常的 <% foreach (var item in Model) { %> 循环。在这个循环中我可以写 <%:

在我的MVC2管理员区域中,我想为我的每个域模型创建一个概览表。 我对这些域模型对象的属性使用如下数据注释:

[DisplayName("MyPropertyName")]
public string Name { get; set; }
现在我的问题是:如果我的视图接收到我的域模型集合,我如何访问DisplayName属性?我需要它来构建表头,这些表头是在通常的

<% foreach (var item in Model) { %>

循环。在这个循环中我可以写

<%: Html.LabelFor(c => item.Name) %>
item.Name)%%>
但是,有没有办法使用项目集合而不是具体实例来访问这些信息


提前谢谢

有一个
ModelMetaData
类,它有一个名为
FromLambdaExpression
的静态方法。如果调用它并传入属性以及
ViewData
,它将返回
ModelMetaData
的实例。该类有一个
DisplayName
属性,该属性应该为您提供所需的内容。您还可以从该对象获取其他元数据信息

例如,您可以创建一个空的
ViewDataDictionary
对象来获取此信息。它可以为空,因为
ModelMetaData
实际上没有使用实例,它只需要泛型类来定义所使用的类型

//This would typically be just your view model data.    
ViewDataDictionary<IEnumerable<Person>> data = new ViewDataDictionary<IEnumerable<Person>>();

ModelMetadata result = ModelMetadata.FromLambdaExpression(p => p.First().Name, data);
string displayName = result.DisplayName;

你可以用一个助手或扩展方法来清理这个问题,但这会让你走上正确的道路。

好的,我按照sgriffinusa的建议(再次感谢!)创建了一个强类型的HtmlHelper:

public static MvcHtmlString MetaDisplayName<TModel, TProperty>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TProperty>> expression) where TModel : class
{
    ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
    return MvcHtmlString.Create(metadata.GetDisplayName());
}
public static MvcHtmlString元显示名(此HtmlHelper,表达式),其中TModel:class
{
ModelMetadata=ModelMetadata.FromLambdaExpression(表达式,helper.ViewData);
返回MvcHtmlString.Create(metadata.GetDisplayName());
}
当然,TModel仍然是一个领域模型的集合,如我的初始问题中所述,但我们可以在视图中调用帮助器,如下所示:

<%: Html.MetaDisplayName(p => p.First().Name) %>
p.First().Name)%%>

您的模型是否键入得很好,如
列表
?是的,它是一个IEnumerable。谢谢您的回答。这很好,但我想知道我是否可以为一组模型属性自动执行此操作(我是否可以以某种方式迭代所有属性?)。我不想创建一个包含所有要在视图中显示的显示名的字典。
<%: Html.MetaDisplayName(p => p.First().Name) %>