2

我有一个代表要在餐厅订购的食物的对象。该对象有一个修饰符组列表(面、烹饪说明、披萨配料等),每个列表都有一个修饰符列表。

某些修饰符选项需要以不同方式显示(例如,浇头需要指定左/右/全部),即使它们是相同的数据类型。

我正在尝试使用 @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。我正在尝试使用它们来显示项目列表,并且我需要能够选择要使用的项目。

我究竟做错了什么?

谢谢!

4

2 回答 2

3

好的,这是真正的解决方案。我不得不使用 for 循环来迭代,而不是使用 foreach 遍历列表。

@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])
    }
}
于 2012-05-04T16:56:07.813 回答
0

解决了!

显然,如果您将列表类型发送到 Html.EditorFor 并且不指定模板,它将遍历列表并使用它为项目类型找到的模板显示每个项目。如果您确实指定了模板,它不会遍历列表并将每个项目发送到该模板,它会尝试将整个列表发送到您的模板,这不是正确的数据类型。

我通过手动遍历列表来修复它:

@foreach (var modifierSelection in Model.ModifierSelections)
{
    if (Model.IsToppingsList)
    {
        @Html.EditorFor(m => modifierSelection, "ToppingSelection")
    }
    else
    { 
        @Html.EditorFor(m => modifierSelection)
    }
}
于 2012-04-19T20:57:59.617 回答