Skip to main content
 首页 » 编程设计

asp.net-mvc之调用 DisplayNameFor 的 IEnumerable 重载

2024年11月24日12bjzhanghao

这个问题在这里已经有了答案:





DisplayNameFor() From List<Object> in Model

(4 个回答)


4年前关闭。




这适用于抓取标题( NOT VALUES ):

@model IEnumerable<SomeModel> 
... 
<th>@Html.DisplayNameFor(m => m.SomeModelProperty)</th> 

如果 SomeModelProperty 是:
[Display(Name = "An Excellent Header")] 
SomeModelProperty { get; set; } 

然后它会在标题 th中显示“一个优秀的标题”元素。

你会认为这不会起作用,因为模型是 IEnumerable,它没有 m.SomeModelProperty,但它起作用是因为 HtmlHelper 有一个 HtmlHelper<IEnumerable<TModel>>使得 lambda 的参数为 TModel ,不是 IEnumerable<TModel> .由于这仅使用元数据,因此不需要集合中的项目。 (尽管 m. 上的智能感知会骗你,让你认为它是一个集合)。我不确定这个很酷的重载是什么时候添加的,但是对于 Index.cshtml 来说非常方便,并且消除了像 @Html.DisplayNameFor(m => @Model.FirstOrDefault().SomeModelProperty) 这样的时髦东西。我想避免。

http://msdn.microsoft.com/en-us/library/hh833697(v=vs.108).aspx

但是,当我的模型不是 IEnumerable 而是包含 IEnumerable 作为属性时,我无法弄清楚如何使其工作,例如:
public class SomeList 
{ 
   public List<SomeModel> SomeModels { get; set; } 
   public int Page { get; set; } 
   public DateTime CurrentAsOf { get; set; } 
} 

我希望对泛型类型参数进行明确,但我认为类型参数是由引擎指定的,该引擎从页面创建的 HtmlHelper 中滴下。我可以在页面中声明一个新的 HtmlHelper,或者以某种方式明确指定类型参数吗?

索引.cshtml:
@model SomeList 
//No idea how to do this: 
@Html.DisplayNameFor<IEnumerable<SomeModel>>(m => m.SomeModelProperty) 

请您参考如下方法:

即使没有行也可以使用的另一个类似解决方法可能是:

... 
@{var dummy = Model.FirstOrDefault(); } 
    <tr> 
        <th> 
            @Html.DisplayNameFor(model => dummy.SomeModelProperty) 
        </th> 
...