0

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

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

问题是我真的不知道如何传递“从模型属性的 DisplayName 注释获得的文本”,因为(正如它所说)它是从模型类的属性的 display(name) 注释中获得的。Html.DisplayNameFor 在接收 linq 表达式时做类似的事情,但我真的不知道如何在我的辅助方法上实现这种东西。

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

有任何想法吗?

4

1 回答 1

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)

Assuming that SomeProperty on your view model is decorated with the [Display] or [DisplayName] attributes:

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

or:

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

the custom helper will generate:

<th>foo bar</th>
于 2013-08-22T19:44:23.437 回答