从给定的模型属性访问Display(Name)的Helper方法
本文关键字:Name Display Helper 方法 访问 模型 属性 | 更新日期: 2023-09-27 18:28:37
我收集了一些helper方法,它们确实帮助我构建了一些需要的视图。所有这些方法都非常简单有效(尽管可能没有以最好的方式实现)。我在实现这一个方法("RenderTitleCell")时遇到了麻烦,该方法应该使用视图模型的一个属性中的DisplayName来渲染html段,就像下面这样:
<th>text obtained from DisplayName annotation of a model property</th>
问题是,我真的不知道如何传递"从模型属性的DisplayName注释获得的文本",因为(正如它所说的)它是从属性的模型类的display(name)注释获得的。Html.DisplayNameFor在接收linq表达式时也做了类似的事情,但我真的不知道如何在我的helper方法上实现这种东西。
到目前为止,我的方法只接收要在<th>,但这真的没有多大帮助,因为我不知道如何从视图中获得property的DisplayName,在这种情况下,我必须使用与类上的注释分离的字符串。
有什么想法吗?
您可以从属性的元数据中检索它。
示例:
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>