簡単な答えはあります - ラムダメソッドに引数として渡すモデルがなければなりません。ビューにモデルがなく、DisplayForまたはEditorForを呼び出すと、「テンプレートは、フィールドアクセス、プロパティアクセス、1次元配列インデックス、または単一パラメータカスタムインデクサ式でのみ使用できます」というエラーメッセージが表示されます。
DisplayForを使用するにはモデルが必要ですが、実際には使用する必要はありません。たとえば、これを行うことができます:
Html.EditorFor(m => i)
この場合、HTMLの名前とIDは両方とも "i"になります。
しかし、注意すべき点がいくつかあります。たとえば、Shared/Display TemplatesまたはEditor Templatesフォルダに、SubModelのための強く型付けされた部分的なビューを作成することができます。この場合、DisplayForでforeachを使用することができます。
あなたがEditorForを使用していて、戻っモデルにバインドするために掲示場にしたい場合は、あなたが使用する必要があります:
for (i = 0; ...)
ではなく、foreachのあなたのHTMLフォームのフィールドは、このようなバインド可能な名前で終わるように、 Subs [1] .Nameとして。あなたはforeachのを使用している場合は、すべての入力は、例えば、同じ名前とIDを持つことになります。
id="s_Name" name="s.Name"
forループを持つのに対し、あなたが得る:forループ
id="SubModels_0__Name" name="SubModels[0].Name"
ザ・法的なHTML(固有のIDを生成し)、サーバー上のリストにリバウンドすることができます。
明確にする:EditorForまたはDisplayForを使用するときは、2つの注意すべき事項があります。まず、渡す式が、Html要素に使用されるフィールド名を決定します。式がモデルに関連する場合、名前は上の例に示すようにモデルから派生します。私はモデルにサブクラスにバインドされたのであれば:
Html.DisplayFor(m => m.Submodel.Name)
HTMLフィールド名が「Submodel.Name」になり、それは同じ階層にポストバックに再バインドされます(あなたはまた、使用して名前を自分で設定できることに注意してくださいオーバーロードされたメソッドの1つ)。
第2の側面は、式が型指定されていることです(つまり、CLR型またはカスタム型のいずれかに解決されます)。その型をレンダリングするために、MVCはモデルが一致するテンプレートを探します。現在のViewフォルダ、次にSharedフォルダから始まるパス階層を使用してテンプレートを検索し、カスタムフォルダが見つからない場合は内部テンプレートに戻ります。
したがって、必要なレンダリングとポストバックのバインディングを実現するには、これらの両方を考慮する必要があります。しかし、データの表示にのみ関心がある場合は、モデルに一致するHtmlフィールド名を心配する必要はなく、任意の名前を使用することも、まったく使用しないこともできます。しかし、HTMLのIDは一意でなければならないことに注意してください。上の例のように、同じIDで終わることができます。現在のブラウザの作物はそれに問題はないようですが、あなたがidで選択するためにJavascriptを使いたいのであれば面白いでしょう。
'Html.DisplayFor(m => m.Subs)'は、(テンプレート名を指定しない限り)コレクションの各項目の 'SubModel'テンプレートをレンダリングすることを知っています。 、 右?では、一般的に、フォームに任意の数の要素があり、リストにバインドする必要があるシナリオについて話していますか? –
はい、良い点。表示テンプレート(またはエディタテンプレート)を使用して子オブジェクトをレンダリングしていない場合や、ユーザーが何らかの形で関心のあるレコードのサブセットを特定している場合は、私のオプションが何であるかを知りたいと思います。 –