MVC EditorForという名前のTemplateの問題
-
26-10-2019 - |
質問
私は(とにかく私に)奇妙な問題のように見えるものを持っています...
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
デフォルトのテンプレートが機能し、名前付きテンプレートが機能しない理由がわかりません。どんな助けも感謝します。
ありがとう。
解決
あなたが電話するとき @Html.EditorFor(c => c.Categories)
IENUMERABLEのデフォルトテンプレートに戻っています。このデフォルトのテンプレートはMVCフレームワークによって提供され、その動作は出力することです Html.EditorFor()
列挙の各アイテムについて。これにより、リスト内の各アイテムの適切なエディターテンプレートが個別に発生します - あなたの場合、それらはすべてのインスタンスです SelectListItem
, 、したがって、最初のケースでは、 SelectListItem
テンプレートは各アイテムに使用されます。
2番目のケースでは、明示的に設定します EditorFor
特定のエディターテンプレートを使用します CategoryIcons
, 、あなたはそれがそのエディターテンプレートを使用するように言っています 列挙全体, 、列挙可能なものをデフォルトでテンプレートできるようにする代わりに、列挙された各アイテムのテンプレートを使用します。
まだこれについての最良の方法がわかりません。
1つのアプローチは、aを定義することです CategoryIcons
テンプレート、そのモデルはのインスタンスです IEnumerable<CategoryIcon>
, 、それは単にeachになります Model
列挙、および実行 Html.EditorFor
各アイテムについて、明示的なテンプレートの参照があります CategoryIcon
. 。次に、そのテンプレート(CategoryIcon
いいえ CategoryIcons
)。その後、これを行うことでこれを呼び出します @Html.EditorFor(c => c.Categories, "CategoryIcons")
.
私はこれを成し遂げるためのより良い方法があるかどうかを確認するために周りを見回しますが、これが今のところ役立つかもしれないことを願っています。テンプレートをパラメーター化できれば素晴らしいので、それぞれのアイテムに使用するテンプレートの名前を引数として取るIENUMARABLEテンプレートを記述できます。
他のヒント
ちょうどアップデートで、私は自分で同じ問題に対処しようとしてこの質問に出くわしました。
私がやったことは、コレクションの各インスタンスを繰り返して、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で書きます)
editorforを使用している場合、ループソリューションが機能するとは思いません。 ienumerableテンプレートを使用することは、フォーム入力に正しく名前を付ける唯一の方法であるようです。あなたが繰り返し編集者に電話するだけなら、あなたのフォーム <INPUT>
sは、インデックス付きIDではなく、同じIDを持ちます。
私はこの問題を経験しました 解決 列挙可能なテンプレートを放出することでした いいえ リスト項目をループします。
これをコメントではなく答えにして申し訳ありません - コメントの権利はありません。