为什么我的DisplayFor没有遍历我的IEnumerable <DateTime>?

rem*_*rel 18 view asp.net-mvc-3

在我看来,我有这条线

@(Html.DisplayFor(m => m.DaysOfWeek, "_CourseTableDayOfWeek"))
Run Code Online (Sandbox Code Playgroud)

这里m.DaysOfWeek是一个IEnumerable<DateTime>.

有_CourseTableDayOfWeek.cshtml的内容:

@model DateTime
@{
    ViewBag.Title = "CourseTableDayOfWeek";
}
<th>
    @System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.DayNames[(int) Model.DayOfWeek]
    <span class="dateString">Model.ToString("G")</span>
</th>
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

传递到字典中的模型项的类型为' System.Collections.Generic.List`1[System.DateTime]',但此字典需要类型为' System.DateTime' 的模型项.

如果我参考以下帖子:

/sf/answers/395676711/

DisplayFor应通过的IEnumerable被循环并为每个项目显示模板,不应该吗?

Dar*_*rov 24

它不是循环的,因为您已将显示模板的名称指定为DisplayForhelper(_CourseTableDayOfWeek)的第二个参数.

只有当你依赖惯例时它才会循环

@Html.DisplayFor(m => m.DaysOfWeek)
Run Code Online (Sandbox Code Playgroud)

然后在里面~/Views/Shared/DisplayTemplates/DateTime.cshtml:

@model DateTime
@{
    ViewBag.Title = "CourseTableDayOfWeek";
}
<th>
    @System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.DayNames[(int) Model.DayOfWeek]
    <span class="dateString">Model.ToString("G")</span>
</th>
Run Code Online (Sandbox Code Playgroud)

为显示模板指定自定义名称(作为DisplayFor助手的第二个参数或作为[UIHint]属性)后,它将不再循环访问集合属性,模板将仅IEnumerable<T>作为模型传递.

令人困惑,但事实就是如此.我也不喜欢它.

  • 同上.这些助手的另一个方面是难以调试而且根本不清楚. (5认同)
  • 我陷入了同样的陷阱.这对我来说似乎完全违反直觉.我希望这会随着MVC 4而改变. (4认同)
  • @JohnH它没有改变.仍然在MVC 5中以这种方式工作. (2认同)