Asp.net mvc 3 为什么我的显示器没有循环使用我的IEnumerable<;日期时间>;?

Asp.net mvc 3 为什么我的显示器没有循环使用我的IEnumerable<;日期时间>;?,asp.net-mvc-3,view,Asp.net Mvc 3,View,我的观点是这样的 @(Html.DisplayFor(m => m.DaysOfWeek, "_CourseTableDayOfWeek")) 其中m.DaysOfWeek是一个IEnumerable _CourseTableDayOfWeek.cshtml的内容如下: @model DateTime @{ ViewBag.Title = "CourseTableDayOfWeek"; } <th> @System.Globalization.CultureI

我的观点是这样的

@(Html.DisplayFor(m => m.DaysOfWeek, "_CourseTableDayOfWeek"))
其中
m.DaysOfWeek
是一个
IEnumerable

_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>
@model-DateTime
@{
ViewBag.Title=“CourseTableDayOfWeek”;
}
@System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.DayNames[(int)Model.DayOfWeek]
型号:ToString(“G”)
我得到以下错误:

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

如果我指的是以下帖子:


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

它没有循环,因为您已将显示模板的名称指定为
DisplayFor
帮助程序的第二个参数(
\u 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>
@model-DateTime
@{
ViewBag.Title=“CourseTableDayOfWeek”;
}
@System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.DayNames[(int)Model.DayOfWeek]
型号:ToString(“G”)
为显示模板指定自定义名称后(作为DisplayFor helper的第二个参数或作为
[UIHint]
属性),它将不再循环集合属性,模板将仅作为模型传递
IEnumerable


这让人困惑,但事实就是这样。我也不喜欢它。

这好像是个bug。Html助手类很容易扩展,尽管在查看了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());
    }
}

IEnumerable
属性上使用
FilterUIHint
而不是常规的
UIHint

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

现在,它显示了一个
“\u CourseTableDayOfWeek”
编辑模板,用于
DateTime
中的每个
DateOfWeek

中的
DateOfWeek
编辑模板

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());
        }
    }
公共静态类DisplayTextListExtension
{
公共静态MvcHtmlString DisplayForList(此HtmlHelper html、IEnumerable模型、字符串模板名)
{
var tempResult=新的StringBuilder();
foreach(模型中的var项目)
{
Append(html.DisplayFor(m=>item,templateName));
}
返回MvcHtmlString.Create(tempResult.ToString());
}
}

同上。这些助手的另一个方面很难调试,而且一点也不清楚。我只是落入了同样的陷阱。我觉得这完全违反直觉。我希望MVC4能改变这一点。@JohnH它没有改变。在MVC5中仍然可以这样工作。我无法让它工作。它只是忽略了FilterUIHint,就像没有注释一样。您还使用了DisplayFor,但对每个都使用了EditorTemplate;这是一个错误还是故意的?
@Html.DisplayFor(m => m.DaysOfWeek)
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());
        }
    }