从给定的模型属性访问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,在这种情况下,我必须使用与类上的注释分离的字符串。

有什么想法吗?

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

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

示例:

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>