我有一些帮助方法的集合,真正帮助我建立了我需要的一些视图。所有这些都非常简单有效(尽管可能没有以最好的方式实现)。我在实现这一个方法(“RenderTitleCell”)时遇到了麻烦,它应该使用视图模型属性中的一个DisplayName渲染一个html片段,就像这个:
<th>text obtained from DisplayName annotation of a model property</th>
问题是我真的不知道如何传递“从模型属性的DisplayName注释中获取的文本”,因为(因为它声明)它是从模型类'属性的显示(名称)注释获得的。 Html.DisplayNameFor做类似的事情接收一个linq表达式,但我真的不知道如何在我的帮助方法上实现这种东西。
到目前为止,我的方法只接收要输出的字符串&lt; th&gt;,但这实际上没有多大帮助,因为我不知道如何从视图中获取propoerty的DisplayName,在这种情况下,我必须使用从类上的注释中分离的字符串。
有什么想法吗?
答案 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>