Helper方法从给定的模型属性访问Display(Name)

时间:2013-08-22 19:31:48

标签: c# asp.net-mvc html-helper

我有一些帮助方法的集合,真正帮助我建立了我需要的一些视图。所有这些都非常简单有效(尽管可能没有以最好的方式实现)。我在实现这一个方法(“RenderTitleCell”)时遇到了麻烦,它应该使用视图模型属性中的一个DisplayName渲染一个html片段,就像这个:

 <th>text obtained from DisplayName annotation of a model property</th>

问题是我真的不知道如何传递“从模型属性的DisplayName注释中获取的文本”,因为(因为它声明)它是从模型类'属性的显示(名称)注释获得的。 Html.DisplayNameFor做类似的事情接收一个linq表达式,但我真的不知道如何在我的帮助方法上实现这种东西。

到目前为止,我的方法只接收要输出的字符串&lt; th&gt;,但这实际上没有多大帮助,因为我不知道如何从视图中获取propoerty的DisplayName,在这种情况下,我必须使用从类上的注释中分离的字符串。

有什么想法吗?

1 个答案:

答案 0 :(得分:4)

您可以从属性的元数据中检索它。

示例:

public static IHtmlString MyHelperFor<TModel, TValue>(
    this HtmlHelper<TModel> html, 
    Expression<Func<TModel, TValue>> expression
)
{
    var metadata = ModelMetadata.FromLambdaExpression(expression, html.ViewData);
    string name = metadata.DisplayName;

    return new HtmlString(string.Format("<th>{0}</th>", html.Encode(name)));
}

然后:

@model MyViewModel
...
@Html.MyHelperFor(x => x.SomeProperty)

假设视图模型上的SomeProperty使用[Display][DisplayName]属性进行修饰:

[DisplayName("foo bar")]
public string SomeProperty { get; set; }

或:

[Display(Name = "foo bar")]
public string SomeProperty { get; set; }

自定义助手将生成:

<th>foo bar</th>