21

(とにかく私には)奇妙な問題のように見えるものがあります...

たとえば、SelectListItem (~/Views/Shared/EditorTemplates フォルダー内の SelectListItem.cshtml) の単純なエディター テンプレートを作成しました。

<ul class="select-list-item cell-15 col-3 omega clearfix">
    @Html.EditorFor(c => c.Categories)
</ul>

c.Categories は IEnumerable です

これは問題なく機能しましたが、別のテンプレートでコレクションをわずかに異なるマークアップでレンダリングする必要があったため、エディター テンプレートをコピーして名前を「CategoryIcons.cshtm」などに変更し、次のように呼び出しました。

<ul class="select-list-item cell-15 col-3 omega clearfix">
    @Html.EditorFor(c => c.Categories, "CategoryIcons")
</ul>

要するに、唯一の違いは、名前付きエディター テンプレートを指定していることです。

ページを開くと、次のエラーが表示されます。

ディクショナリに渡されたモデル アイテムのタイプは 'System.Collections.Generic.List`1[System.Web.Mvc.SelectListItem]' ですが、このディクショナリにはタイプ 'System.Web.Mvc.SelectListItem' のモデル アイテムが必要です

両方のテンプレート id のテンプレートのモデル宣言:

@model System.Web.Mvc.SelectListItem

デフォルトのテンプレートが機能し、名前付きテンプレートが機能しない理由がわかりません。どんな助けでも大歓迎です。

ありがとう。

4

3 に答える 3

29

呼び出す@Html.EditorFor(c => c.Categories)と、IEnumerable の既定のテンプレートに戻ります。この既定のテンプレートは MVC フレームワークによって提供され、その動作はHtml.EditorFor()列挙内の各項目を出力することです。次に、リスト内の各アイテムに適切なエディター テンプレートを個別に発行します。この場合、それらはすべて のインスタンスでSelectListItemあるため、最初のケースでは、SelectListItemテンプレートが各アイテムに使用されます。

EditorFor2 番目のケースでは、特定のエディター テンプレートを使用するように明示的に設定することで、列挙型をデフォルトでテンプレート化するのではなく、列挙型全体CategoryIconsでそのエディター テンプレートを使用するように指示し、列挙された各項目のテンプレートを順番に使用します。 .

これを回避する最善の方法はまだわかりません。

1 つのアプローチはCategoryIcons、モデルが のインスタンスであるテンプレートを定義することですIEnumerable<CategoryIcon>。これは単にModel列挙をforeach しHtml.EditorFor、各項目に対して実行し、 の明示的なテンプレート参照を使用しCategoryIconます。次に、アイテムごとのエディター テンプレートをそのテンプレートに配置します ( CategoryIconnot CategoryIcons)。次に、 を実行してこれを呼び出します@Html.EditorFor(c => c.Categories, "CategoryIcons")

これを行うためのより良い方法があるかどうかを確認するために周りを見回すつもりですが、これが今のところ役立つことを願っています. テンプレートをパラメーター化できれば素晴らしいことです。そのため、各項目に使用するテンプレートの名前を引数として受け取る IEnumerable テンプレートを作成できます。

于 2011-04-28T12:20:41.817 に答える
5

ただの更新ですが、同じ問題に自分で対処しようとして、この質問に出くわしました。

私が最終的に行ったことは、コレクションの各インスタンスを繰り返し処理し、EdtorFor を個別に呼び出すことでした。次のようなものです。

<ul class="select-list-item cell-15 col-3 omega clearfix">
    @for (int i=0;i<Model.Categories.Count;i++) {
        @Html.EditorFor(c => c.Categories[i], "CategoryIcons")
    }
</ul>

まだきれいではありませんが、あなたのように新しいクラスを継承するよりも好きです。

(私のC#構文が少しずれていたらすみません、vb.netで書いています)

于 2011-08-11T16:13:06.487 に答える
1

EditorFor を使用している場合、ループ ソリューションは機能しないと思います。IEnumerable テンプレートを使用することが、フォーム入力に正しく名前を付けるための唯一の方法のようです。EditorFor を繰り返し呼び出すと、フォーム<INPUT>はインデックス付き ID ではなく同じ ID になります。

私はこの問題を経験しましたが、解決策は列挙可能なテンプレートを発行し、リスト項目をループしないことでした。

これをコメントではなく回答にして申し訳ありません-コメントする権利はありません。

于 2011-08-31T18:59:47.690 に答える