在ASP.NET MVC中获取DisplayName属性而不使用LabelFor助手函数

65

如何最好地检索模型中项目的显示名称属性?我看到很多人在使用LabelFor helper进行所有操作,但是如果我只想列出数据,那么标签就不合适了。如果我只想将其打印在一个段落中,有没有一种简单的方法来获取Name Attribute?

3个回答

113
<p>
    <%= Html.Encode(
        ModelMetadata.FromLambdaExpression<YourViewModel, string>(
            x => x.SomeProperty, ViewData).DisplayName
    ) %>
<p>

显然,为了避免过于复杂的代码,编写一个帮助器是一个不错的主意:

public static class HtmlExtensions
{
    public static MvcHtmlString GetDisplayName<TModel, TProperty>(
        this HtmlHelper<TModel> htmlHelper, 
        Expression<Func<TModel, TProperty>> expression
    )
    {
        var metaData = ModelMetadata.FromLambdaExpression<TModel, TProperty>(expression, htmlHelper.ViewData);
        string value = metaData.DisplayName ?? (metaData.PropertyName ?? ExpressionHelper.GetExpressionText(expression));
        return MvcHtmlString.Create(value);
    }
}

然后:

<p>
    <%: Html.GetDisplayName(x => x.SomeProperty) %>
</p>

谢谢,这正是我想要的,而且更多! - Graham Conzett
3
请注意,你需要使用以下这些 using 才能完成这个任务:using System.Linq; using System.Linq.Expressions; - James McCormack
1
这样做会有什么性能影响?我喜欢在所有视图中使用这个想法,但它听起来比只在.cshtml文件中放置文本要复杂得多。 - Farinha
有人知道这个是在MVC3还是MVC4 beta中添加的吗? - GraemeMiller
36
在MVC 4中,它被称为DisplayNameFor。 - Tristan Warner-Smith
是的,MVC 4+ 应该使用这个扩展方法:https://dev59.com/y2865IYBdhLWcg3wTcpY#17471459 - Hugh Jeffner

76

你应该尝试新的现有函数:

<% Html.DisplayNameFor(m => m.YourProperty) %>

5
剃刀:@Html.DisplayNameFor(model => model.SomeProperty)这段代码是ASP.NET MVC中用于在视图中显示某个模型属性的名称。它使用了C#中的Lambda表达式语法,通过传递模型属性作为参数来获取该属性的名称,并使用ASP.NET MVC框架提供的DisplayName属性来确保该名称被正确地本地化和格式化。 - Eskil Mjelva Saatvedt

1
在我看来,你应该使用字符串作为结果类型,否则你会跳过编码机制。另一个要点是,在某些情况下,你需要将DisplayName作为字符串(例如,在WebGrid类中填充列)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接