我有一个对象代表在餐厅订购的食品。此对象有一个修改器组列表(侧面,烹饪说明,披萨配料,等等),每个列表都有一个修饰符列表。
某些修改器选项需要以不同方式显示(例如,浇头需要指定左/右/全部),即使它们是相同的数据类型。
我正在尝试使用@ Html.EditorFor并在需要时指定备用EditorTemplate。
在/ Views / Shared / EditorTemplates中我有ModifierSelection.cshtml和ToppingSelection.cshtml。我在以下视图中调用它们:
@model MyApp.ViewModels.ModifierSelectionList
<div class="menugroup">
<h3 class="menuname">@Model.ModifierListName: (Select @Model.MaximumSelections)</h3>
<div class="modcountvalidation">@Model.ValidationResults</div>
@Html.HiddenFor(model => Model.ModifierListId)
<table class="menu">
@if (Model.IsToppingsList)
{
@Html.EditorFor(model => Model.ModifierSelections, "ToppingSelection")
}
else
{
@Html.EditorFor(model => Model.ModifierSelections)
}
</table>
</div>
当我尝试显示需要“ToppingSelection”EditorTemplate而不是默认值的项时,我收到以下错误:
System.InvalidOperationException was unhandled by user code
Message=The model item passed into the dictionary is of type 'System.Collections.Generic.List`1[MyApp.ViewModels.ModifierSelection]', but this dictionary requires a model item of type 'MyApp.ViewModels.ModifierSelection'.
Source=System.Web.Mvc
所以 - 我有一组数据类型的EditorTemplates。我试图用它们来显示项目列表,我需要能够选择使用哪一个。
我做错了什么?
谢谢!
答案 0 :(得分:3)
好的,这是真正的解决方案。不是使用foreach遍历列表,而是使用for循环迭代。
@for (int i = 0; i < Model.ModifierSelections.Count; i++ )
{
if (Model.IsToppingsList)
{
@Html.EditorFor(m => Model.ModifierSelections[i], "ToppingSelection")
}
else
{
@Html.EditorFor(m => Model.ModifierSelections[i])
}
}
答案 1 :(得分:0)
解决!
显然,如果您将列表类型发送到Html.EditorFor并且未指定模板,它将遍历列表并使用为项目类型找到的模板显示每个项目。如果您指定了模板,它将不会遍历列表并将每个项目发送到该模板,它将尝试将整个列表发送到您的模板,这不是正确的数据类型。
我通过手动迭代列表来修复它:
@foreach (var modifierSelection in Model.ModifierSelections)
{
if (Model.IsToppingsList)
{
@Html.EditorFor(m => modifierSelection, "ToppingSelection")
}
else
{
@Html.EditorFor(m => modifierSelection)
}
}