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());
}
}