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

OK、これが本当の解決策です。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])
    }
}
于 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 に答える