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

时间:2011-12-30 11:06:04

标签: asp.net-mvc-3 view

我在视图中有这一行

@(Html.DisplayFor(m => m.DaysOfWeek, "_CourseTableDayOfWeek"))

其中m.DaysOfWeekIEnumerable<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>

我收到以下错误:

  

传入字典的模型项的类型为“System.Collections.Generic.List`1[System.DateTime]”,但此字典需要类型为“System.DateTime”的模型项。

如果我参考以下帖子:

https://stackoverflow.com/a/5652524/277067

DisplayFor应循环遍历IEnumerable并显示每个项目的模板,不应该吗?

4 个答案:

答案 0 :(得分:24)

它没有循环,因为您已将显示模板的名称指定为DisplayFor助手(_CourseTableDayOfWeek)的第二个参数。

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

@Html.DisplayFor(m => m.DaysOfWeek)

然后在~/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>

为显示模板指定自定义名称(作为DisplayFor助手的第二个参数或[UIHint]属性)后,它将不再循环收集属性,模板将只传递{{1作为模型。

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

答案 1 :(得分:0)

这似乎是一个错误。 Html Helper类很容易扩展,虽然在查看MVC源代码后查找bug,但我放弃了,并且只是利用了模板适用于单个项目的前提,因此我编写了一个HtmlHelper扩展,为您包装它。我为了自己的简单而取出了lambda表达式,但你可以很容易地回到那里。此示例仅用于字符串列表。

    public static class DisplayTextListExtension
{
    public static MvcHtmlString DisplayForList<TModel>(this HtmlHelper<TModel> html, IEnumerable<string> model, string templateName)
    {
        var tempResult = new StringBuilder();

        foreach (var item in model)
        {
            tempResult.Append(html.DisplayFor(m => item, templateName));
        }

        return MvcHtmlString.Create(tempResult.ToString());
    }
}

然后实际用法如下:

                                @Html.DisplayForList(Model.Organizations, "infoBtn")

答案 2 :(得分:0)

稍作调整即可使Dan's solution更加通用:

public static class DisplayTextListExtension
    {
        public static MvcHtmlString DisplayForList<TModel, 
EModel>(this HtmlHelper<TModel> html, IEnumerable<EModel> model, string templateName)
        {
            var tempResult = new StringBuilder();

            foreach (var item in model)
            {
                tempResult.Append(html.DisplayFor(m => item, templateName));
            }

            return MvcHtmlString.Create(tempResult.ToString());
        }
    }

答案 3 :(得分:-1)

FilterUIHint媒体资源上使用UIHint代替常规IEnumerable<T>

public class MyModel
{
    [FilterUIHint("_CourseTableDayOfWeek")]
    public IEnumerable<DateTime> DaysOfWeek { get; set; }
}

不需要任何其他内容。

@Html.DisplayFor(m => m.DaysOfWeek)

现在为"_CourseTableDayOfWeek"中的每个DateTime显示DaysOfWeek EditorTemplate。