2012-04-18 9 views
2

私はレストランで注文する食品を表すオブジェクトを持っています。このオブジェクトには修飾子グループ(辺、料理命令、ピザトッピングなど)のリストがあり、各リストには修飾語のリストがあります。リストの代替EditorForテンプレートの選択

特定の修飾子オプションは、同じデータ型であっても、異なる表示(たとえば、左/右/すべてを指定する必要があります)が必要です。

@ 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のセットを持っています。私はアイテムのリストを表示するためにそれらを使用しようとしており、使用するアイテムを選択できる必要があります。

私は間違っていますか?

ありがとうございます!

答えて

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]) 
    } 
} 
0

解決済み!

Html.EditorForにリストタイプを送信し、テンプレートを指定しない場合は、リストを繰り返して、アイテムタイプで見つかったテンプレートを使用して各アイテムを表示します。テンプレートを指定すると、リストを反復して各テンプレートをそのテンプレートに送信することはありません。正しいデータ型ではないテンプレート全体にリストを送信しようとします。

私は手動でリストを反復処理によってそれを修正:

@foreach (var modifierSelection in Model.ModifierSelections) 
{ 
    if (Model.IsToppingsList) 
    { 
     @Html.EditorFor(m => modifierSelection, "ToppingSelection") 
    } 
    else 
    { 
     @Html.EditorFor(m => modifierSelection) 
    } 
} 
+1

間違っています - これは動作しません。これは正しく表示されますが、データはモデルのビューに戻されません。どうやら、EditorForで代替テンプレートを指定すると、リストタイプに対して反復処理は行われませんが、手動でリストを反復処理するとモデルが正しくリストアップされません。これを行う方法はありますか? – pcbliss

関連する問題