C#MVC4 Razor-可以使用DisplayNameFor获得不同型号的显示器(名称=..)

本文关键字:显示器 名称 同型 可以使 Razor- DisplayNameFor C#MVC4 | 更新日期: 2023-09-27 18:25:08

当我的视图中有模型时,我可以通过轻松访问成员的DisplayName

@Html.DisplayNameFor(m => m.myMember)

但是,当我需要来自不同模型的成员的DisplayName时,似乎没有简单的解决方案,有些人正在挖掘ModelMetaDataSystem.ComponentModel.DataAnnotations.DisplayAttribute,但这些都是不容易阅读或理解的多步骤内容。

如果你看一下DisplayNameFor 的定义

DisplayNameFor<TModel, TValue>(
    this HtmlHelper<IEnumerable<TModel>> html,
    Expression<Func<TModel, TValue>> expression
)

它似乎可以很容易地被这样的东西使用

@Html.DisplayNameFor<MyDifferentModel, string>(?, m => m.memberInMyDifferentModel)

但我不知道其中一个参数TModel是模型,TValue我的成员的类型,表达式m => m.myMember的东西,但另一个参数是什么?有可能用这种方式使用DisplayNameFor吗?缺失的部分是什么?

感谢您的任何建议-www和SO上的示例都只处理视图中有模型、视图中有嵌套模型的情况,以及视图中的模型可以直接访问的任何内容,但这不是我想要的。

编辑:

现在我使用这个助手函数来获得显示名称

public string getDisplayName<Type>(string member)
{
    var type = typeof(Type);
    var memInfo = type.GetMember(member);
    var attributes = memInfo[0].GetCustomAttributes(typeof(System.ComponentModel.DataAnnotations.DisplayAttribute), false);
    var displayname = ((System.ComponentModel.DataAnnotations.DisplayAttribute)attributes[0]).Name;
        return displayname;
}

可以很容易地与一起使用

getDisplayName<MyDifferentModel>("memberInMyDifferentModel");

我只是想知道这个功能是否已经构建在HTML助手DisplayNameFor中了。。。

C#MVC4 Razor-可以使用DisplayNameFor获得不同型号的显示器(名称=..)

经过一些研究。。。似乎你必须创建自己的Html,所以在之后

var MyHtml = new HtmlHelper<MyDifferentModel>(ViewContext, Html.ViewDataContainer)

在您看来(不知道重用已经实例化的HtmlViewContextViewDataContainer是个好主意还是个问题),您可以使用

MyHtml.DisplayNameFor(m => m.memberInMyDifferentModel)

以获取该显示名称。或者如果你想把它放在一行。。。

(new HtmlHelper<MyDifferentModel>(ViewContext, Html.ViewDataContainer)).DisplayNameFor(m => m.memberInMyDifferentModel)

虽然这似乎有效(而且似乎是一个比挖掘注释更干净的解决方案),但我还不明白:为什么你需要创建一个新的Html,而不能直接使用Html.DisplayNameFor<TModel,TValue>中的泛型?请评论。。。

尝试使用:

[DisplayName("Sub-Category Name")]
public string subCategoryName { get; set; }
@Html.DisplayNameFor(model => model.subCategoryName)