【问题标题】:Helper method accessing Display(Name) from given model property从给定模型属性访问 Display(Name) 的辅助方法
【发布时间】:2013-08-23 03:44:23
【问题描述】:

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

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

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

到目前为止,我的方法只是接收要在

上输出的字符串,但这并没有太大帮助,因为我不知道如何从视图中获取属性的 DisplayName,在这种情况下我必须使用从类上的注释中分离出来的字符串。

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

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

    例子:

    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>
    

    【讨论】:

    • 猜猜我的问题的很大一部分是在 App_Code 文件夹中使用了一个 cshtml 文件,并带有 @helper 方法 sintax。这确实缩小了我的可能性。无论如何,你的建议似乎很完美......将实现一个常规的帮助类并摆脱我目前正在使用的这种格式。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    相关资源
    最近更新 更多