オブジェクトのリストに関する MVC モデル バインディングの問題のトラブルシューティング
この記事は、MVC アプリケーションの一般的な問題、つまりモデル バインダーがフォーム データからオブジェクトのリストを正しく設定できない問題に対処します。 この症状は、一見正しいフォーム送信にもかかわらず、コントローラー アクションの null リストです。
根本原因: インデックスの欠落
核心的な問題は、フォーム要素にインデックスが作成されていないことにあります。 インデックスがないと、モデル バインダーはリスト内の個々の要素を区別できません。 たとえば、次のシナリオを考えてみましょう。フォームには、最初は一意の識別子のない要素が含まれています。
<code><!-- Incorrect: Missing indices --></code>
解決策: EditorTemplate の活用
この解決策には、EditorTemplates を使用して、正しくインデックス付けされたフォーム要素を自動的に生成することが含まれます。これにより、手動インデックス作成が不要になり、適切なモデル バインディングが保証されます。
実装手順:
EditorTemplates フォルダーの作成: Views フォルダー内に「EditorTemplates」という名前の新しいフォルダーを作成します。 このフォルダーは、他のビュー ファイルと同じディレクトリ内に存在する必要があります。
厳密に型指定されたビューの作成: EditorTemplates フォルダー内に、名前がモデル クラス (例: PlanCompareViewModel.cshtml
) と一致する、厳密に型指定されたビュー ファイルを作成します。
部分ビューのコンテンツを移行する: 元の部分ビューから HTML コンテンツを、新しく作成したこの EditorTemplate に移動します。
Utilize EditorForModel()
: EditorForModel()
ヘルパー メソッドを使用するように親ビューを変更します。 このヘルパーは、モデルに基づいて、正しくインデックス付けされたフォーム要素を自動的にレンダリングします。
@model IEnumerable<plancompareviewmodel> @using (Html.BeginForm("ComparePlans", "Plans", FormMethod.Post, new { id = "compareForm" })) { <div> @Html.EditorForModel() </div> }
このアプローチを採用すると、モデル バインダーはコントローラー アクション内のオブジェクトのリストを正しく解釈して設定します。 EditorForModel()
ヘルパーは各要素に必要なインデックスを動的に生成し、バインディングの問題を解決します。
以上がMVC モデル バインダーがフォームからオブジェクトのリストを入力できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。